Merge pull request #25 from gspencergoog/switch_on_actions

Turns on GitHub Actions so that we can have some CI in here.
diff --git a/.github/workflows/process_runner.yml b/.github/workflows/process_runner.yml
new file mode 100644
index 0000000..d803c61
--- /dev/null
+++ b/.github/workflows/process_runner.yml
@@ -0,0 +1,38 @@
+name: Process Package
+
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+  workflow_dispatch:
+
+jobs:
+  correctness:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+      - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603
+        with:
+          sdk: dev
+      - name: Install dependencies
+        run: dart pub upgrade
+      - name: Verify formatting
+        run: dart format --output=none --line-length=100 --set-exit-if-changed .
+      - name: Analyze project source
+        run: dart analyze --fatal-infos
+  test:
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [ubuntu-latest, macos-latest, windows-latest]
+        sdk: [stable, beta, dev]
+    steps:
+      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+      - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603
+        with:
+          sdk: ${{ matrix.sdk }}
+      - name: Install dependencies
+        run: dart pub upgrade
+      - name: Run Tests
+        run: dart test
diff --git a/analysis_options.yaml b/analysis_options.yaml
index db2cc78..f7b8674 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -11,10 +11,6 @@
 # See the configuration guide for more
 # https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
 
-# Too many false positives: pedantic enforces "omit_local_variable_types", and
-# we don't.
-# include: package:pedantic/analysis_options.yaml
-
 analyzer:
   strong-mode:
     implicit-casts: false
@@ -44,16 +40,18 @@
     # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
     - always_require_non_null_named_parameters
     - always_specify_types
+    # - always_use_package_imports # we do this commonly
     - annotate_overrides
     # - avoid_annotating_with_dynamic # conflicts with always_specify_types
-    # - avoid_as # required for implicit-casts: true
     - avoid_bool_literals_in_conditional_expressions
     # - avoid_catches_without_on_clauses # we do this commonly
     # - avoid_catching_errors # we do this commonly
     - avoid_classes_with_only_static_members
     # - avoid_double_and_int_checks # only useful when targeting JS runtime
+    - avoid_dynamic_calls
     - avoid_empty_else
     - avoid_equals_and_hash_code_on_mutable_classes
+    - avoid_escaping_inner_quotes
     - avoid_field_initializers_in_const_classes
     - avoid_function_literals_in_foreach_calls
     # - avoid_implementing_value_types # not yet tested
@@ -72,12 +70,13 @@
     - avoid_returning_null_for_void
     # - avoid_returning_this # there are plenty of valid reasons to return this
     # - avoid_setters_without_getters # not yet tested
-    # - avoid_shadowing_type_parameters # not yet tested
+    - avoid_shadowing_type_parameters
     - avoid_single_cascade_in_expression_statements
     - avoid_slow_async_io
+    - avoid_type_to_string
     - avoid_types_as_parameter_names
     # - avoid_types_on_closure_parameters # conflicts with always_specify_types
-    # - avoid_unnecessary_containers # not yet tested
+    - avoid_unnecessary_containers
     - avoid_unused_constructor_parameters
     - avoid_void_async
     # - avoid_web_libraries_in_flutter # not yet tested
@@ -86,37 +85,46 @@
     - camel_case_types
     - cancel_subscriptions
     # - cascade_invocations # not yet tested
+    - cast_nullable_to_non_nullable
     # - close_sinks # not reliable enough
-    # - comment_references # blocked on https://github.com/flutter/flutter/issues/20765
+    # - comment_references # blocked on https://github.com/dart-lang/linter/issues/1142
     # - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
     - control_flow_in_finally
-    # - curly_braces_in_flow_control_structures # not yet tested
+    # - curly_braces_in_flow_control_structures # not required by flutter style
+    - deprecated_consistency
     # - diagnostic_describe_all_properties # not yet tested
     - directives_ordering
+    # - do_not_use_environment # we do this commonly
     - empty_catches
     - empty_constructor_bodies
     - empty_statements
-    # - file_names # not yet tested
+    - exhaustive_cases
+    - file_names
     - flutter_style_todos
     - hash_and_equals
     - implementation_imports
-    - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
+    # - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
     - iterable_contains_unrelated_type
-    # - join_return_with_assignment # not yet tested
+    # - join_return_with_assignment # not required by flutter style
+    - leading_newlines_in_multiline_strings
     - library_names
     - library_prefixes
-    # - lines_longer_than_80_chars # not yet tested
+    - library_private_types_in_public_api
+    # - lines_longer_than_80_chars # not required by flutter style
     - list_remove_unrelated_type
     # - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
-    # - missing_whitespace_between_adjacent_strings # not yet tested
+    - missing_whitespace_between_adjacent_strings
     - no_adjacent_strings_in_list
+    # - no_default_cases # too many false positives
     - no_duplicate_case_values
-    # - no_logic_in_create_state # not yet tested
-    # - no_runtimeType_toString # not yet tested
+    - no_logic_in_create_state
+    # - no_runtimeType_toString # ok in tests; we enable this only in packages/
+    - noop_primitive_operations
     - non_constant_identifier_names
-    # - null_closures  # not yet tested
+    - null_check_on_nullable_type_parameter
+    - null_closures
     # - omit_local_variable_types # opposite of always_specify_types
-    - one_member_abstracts # too many false positives
+    # - one_member_abstracts # too many false positives
     # - only_throw_errors # https://github.com/flutter/flutter/issues/5792
     - overridden_fields
     - package_api_docs
@@ -125,14 +133,14 @@
     # - parameter_assignments # we do this commonly
     - prefer_adjacent_string_concatenation
     - prefer_asserts_in_initializer_lists
-    # - prefer_asserts_with_message # not yet tested
+    # - prefer_asserts_with_message # not required by flutter style
     - prefer_collection_literals
     - prefer_conditional_assignment
     - prefer_const_constructors
     - prefer_const_constructors_in_immutables
     - prefer_const_declarations
     - prefer_const_literals_to_create_immutables
-    # - prefer_constructors_over_static_methods # not yet tested
+    # - prefer_constructors_over_static_methods # far too many false positives
     - prefer_contains
     # - prefer_double_quotes # opposite of prefer_single_quotes
     - prefer_equal_for_default_values
@@ -142,60 +150,72 @@
     - prefer_final_locals
     - prefer_for_elements_to_map_fromIterable
     - prefer_foreach
-    # - prefer_function_declarations_over_variables # not yet tested
+    - prefer_function_declarations_over_variables
     - prefer_generic_function_type_aliases
     - prefer_if_elements_to_conditional_expressions
     - prefer_if_null_operators
     - prefer_initializing_formals
     - prefer_inlined_adds
-    # - prefer_int_literals # not yet tested
-    # - prefer_interpolation_to_compose_strings # not yet tested
+    # - prefer_int_literals # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#use-double-literals-for-double-constants
+    - prefer_interpolation_to_compose_strings
     - prefer_is_empty
     - prefer_is_not_empty
     - prefer_is_not_operator
     - prefer_iterable_whereType
     # - prefer_mixin # https://github.com/dart-lang/language/issues/32
-    # - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932
-    # - prefer_relative_imports # not yet tested
+    - prefer_null_aware_operators
+    # - prefer_relative_imports # incompatible with sub-package imports
     - prefer_single_quotes
     - prefer_spread_collections
     - prefer_typing_uninitialized_variables
     - prefer_void_to_null
-    # - provide_deprecation_message # not yet tested
+    - provide_deprecation_message
     # - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
     - recursive_getters
+    - sized_box_for_whitespace
     - slash_for_doc_comments
     # - sort_child_properties_last # not yet tested
     - sort_constructors_first
-    - sort_pub_dependencies
+    # - sort_pub_dependencies # prevents separating pinned transitive dependencies
     - sort_unnamed_constructors_first
     - test_types_in_equals
     - throw_in_finally
+    - tighten_type_of_initializing_formals
     # - type_annotate_public_apis # subset of always_specify_types
     - type_init_formals
-    - unawaited_futures
-    # - unnecessary_await_in_return # not yet tested
+    # - unawaited_futures # too many false positives
+    - unnecessary_await_in_return
     - unnecessary_brace_in_string_interps
     - unnecessary_const
     # - unnecessary_final # conflicts with prefer_final_locals
     - unnecessary_getters_setters
-    - unnecessary_lambdas
+    # - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
     - unnecessary_new
     - unnecessary_null_aware_assignments
+    - unnecessary_null_checks
     - unnecessary_null_in_if_null_operators
+    - unnecessary_nullable_for_final_variable_declarations
     - unnecessary_overrides
     - unnecessary_parenthesis
+    # - unnecessary_raw_strings # not yet tested
     - unnecessary_statements
+    - unnecessary_string_escapes
     - unnecessary_string_interpolations
     - unnecessary_this
     - unrelated_type_equality_checks
     # - unsafe_html # not yet tested
     - use_full_hex_values_for_flutter_colors
-    # - use_function_type_syntax_for_parameters # not yet tested
-    # - use_key_in_widget_constructors # not yet tested
+    - use_function_type_syntax_for_parameters
+    # - use_if_null_to_convert_nulls_to_bools # not yet tested
+    - use_is_even_rather_than_modulo
+    - use_key_in_widget_constructors
+    - use_late_for_private_fields_and_variables
+    - use_named_constants
+    - use_raw_strings
     - use_rethrow_when_possible
     # - use_setters_to_change_properties # not yet tested
-    - use_string_buffers
-    - use_to_and_as_if_applicable
+    # - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
+    - use_test_throws_matchers
+    # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
     - valid_regexps
     - void_checks
diff --git a/ci/analyze.sh b/ci/analyze.sh
deleted file mode 100755
index b3a1f1d..0000000
--- a/ci/analyze.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-# Copyright 2020 The Flutter Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Fast fail the script on failures.
-set -e
-
-# So cd doesn't print the path it changes to.
-unset CDPATH
-
-# So that developers can run this script from anywhere and it will work as
-# expected.
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
-REPO_DIR="$(dirname "$SCRIPT_DIR")"
-
-function analyze() {
-  # Make sure we pass the analyzer
-  echo "Checking dartanalyzer..."
-  if ! fails_analyzer="$(find lib test ci -name "*.dart" -print0 | xargs -0 dartanalyzer --options analysis_options.yaml)"; then
-    echo "FAILED"
-    echo "$fails_analyzer"
-    exit 1
-  fi
-  echo "PASSED"
-}
-
-cd "$REPO_DIR"
-
-analyze
diff --git a/ci/check_publish.sh b/ci/check_publish.sh
deleted file mode 100755
index 09689ff..0000000
--- a/ci/check_publish.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-# Copyright 2020 The Flutter Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script checks to make sure that the package *could* be published. It
-# doesn't actually publish anything.
-
-# Fast fail the script on failures.
-set -e
-
-
-# So cd doesn't print the path it changes to.
-unset CDPATH
-
-# So that developers can run this script from anywhere and it will work as
-# expected.
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
-REPO_DIR="$(dirname "$SCRIPT_DIR")"
-
-function error() {
-  echo "$@" 1>&2
-}
-
-function check_publish() {
-  echo -n "Checking that package can be published."
-  if (cd "$REPO_DIR" && pub publish --dry-run > /dev/null); then
-    echo "Package package is able to be published."
-  else
-    error "FAIL: The package failed the publishing check."
-    return 1
-  fi
-  return 0
-}
-
-check_publish
diff --git a/ci/format.sh b/ci/fix_format.sh
similarity index 69%
rename from ci/format.sh
rename to ci/fix_format.sh
index 00318f4..af5d087 100755
--- a/ci/format.sh
+++ b/ci/fix_format.sh
@@ -17,19 +17,19 @@
 REPO_DIR="$(dirname "$SCRIPT_DIR")"
 
 function format() {
-  dartfmt_dirs=(lib test ci example)
-  (cd "$REPO_DIR" && dartfmt --line-length=100 "$@" ${dartfmt_dirs[@]})
+  (cd "$REPO_DIR" && dart format --set-exit-if-changed --line-length=100 "$@" lib test ci example)
 }
 
 # Make sure dartfmt is run on everything
 function check_format() {
-  echo "Checking dartfmt..."
-  local needs_dartfmt="$(format -n "$@")"
-  if [[ -n "$needs_dartfmt" ]]; then
+  echo "Checking dart format..."
+  local needs_dart_format
+  needs_dart_format="$(format --output=none "$@")"
+  if [[ $? != 0 ]]; then
     echo "FAILED"
-    echo "$needs_dartfmt"
+    echo "$needs_dart_format"
     echo ""
-    echo "Fix formatting with: ci/format.sh --fix"
+    echo "Fix formatting with: ci/format.sh"
     exit 1
   fi
   echo "PASSED"
@@ -37,12 +37,12 @@
 
 function fix_formatting() {
   echo "Fixing formatting..."
-  format -w "$@"
+  format --output=write "$@"
 }
 
-if [[ "$1" == "--fix" ]]; then
+if [[ "$1" == "--check" ]]; then
   shift
-  fix_formatting "$@"
-else
   check_format "$@"
+else
+  fix_formatting "$@"
 fi
diff --git a/ci/presubmit.sh b/ci/presubmit.sh
deleted file mode 100755
index c369442..0000000
--- a/ci/presubmit.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# Copyright 2020 The Flutter Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Fast fail the script on failures.
-set -e
-
-# This script checks to make sure that each of the plugins *could* be published.
-# It doesn't actually publish anything.
-
-unset CDPATH
-
-# So that developers can run this script from anywhere and it will work as
-# expected.
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
-REPO_DIR="$(dirname "$SCRIPT_DIR")"
-
-cd "$SCRIPT_DIR"
-
-./setup.sh > /dev/null 2>&1
-./analyze.sh && ./format.sh && ./test.sh && ./check_publish.sh
\ No newline at end of file
diff --git a/ci/setup.sh b/ci/setup.sh
deleted file mode 100755
index b2dd575..0000000
--- a/ci/setup.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-# Copyright 2020 The Flutter Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Fast fail the script on failures.
-set -e
-
-# So cd doesn't print the path it changes to.
-unset CDPATH
-
-# So that developers can run this script from anywhere and it will work as
-# expected.
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
-REPO_DIR="$(dirname "$SCRIPT_DIR")"
-
-cd "$REPO_DIR"
-
-pub upgrade
diff --git a/ci/test.sh b/ci/test.sh
deleted file mode 100755
index 6939bc8..0000000
--- a/ci/test.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-# Copyright 2020 The Flutter Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Fast fail the script on failures.
-set -e
-
-# So cd doesn't print the path it changes to.
-unset CDPATH
-
-# So that developers can run this script from anywhere and it will work as
-# expected.
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
-REPO_DIR="$(dirname "$SCRIPT_DIR")"
-
-cd "$REPO_DIR"
-
-# Run the tests.
-pub run test
diff --git a/example/main.dart b/example/main.dart
index 1a2fc1c..294c3c8 100644
--- a/example/main.dart
+++ b/example/main.dart
@@ -11,8 +11,8 @@
 
 import 'dart:io';
 
-import 'package:process_runner/process_runner.dart';
 import 'package:args/args.dart';
+import 'package:process_runner/process_runner.dart';
 
 // This only works for escaped spaces and things in double or single quotes.
 // This is just an example, modify to meet your own requirements.
diff --git a/test/src/live_process_test.dart b/test/src/live_process_test.dart
index dfb0a2f..d5f894b 100644
--- a/test/src/live_process_test.dart
+++ b/test/src/live_process_test.dart
@@ -9,8 +9,8 @@
 import 'dart:io';
 
 import 'package:process/process.dart';
-import 'package:test/test.dart';
 import 'package:process_runner/process_runner.dart';
+import 'package:test/test.dart';
 
 void main() {
   if (!Platform.isLinux && !Platform.isMacOS) {
diff --git a/test/src/process_pool_test.dart b/test/src/process_pool_test.dart
index 8cafe83..ecc5255 100644
--- a/test/src/process_pool_test.dart
+++ b/test/src/process_pool_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:io';
 
-import 'package:test/test.dart';
 import 'package:process_runner/process_runner.dart';
+import 'package:test/test.dart';
 
 import 'fake_process_manager.dart';
 
diff --git a/test/src/process_runner_test.dart b/test/src/process_runner_test.dart
index 9c3ac18..8182b31 100644
--- a/test/src/process_runner_test.dart
+++ b/test/src/process_runner_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:io';
 
-import 'package:test/test.dart';
 import 'package:process_runner/process_runner.dart';
+import 'package:test/test.dart';
 
 import 'fake_process_manager.dart';