diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..fcb7ccb --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,14 @@ +# A CI configuration to auto-publish pub packages. + +name: Publish + +on: + pull_request: + branches: [ master ] + push: + tags: [ 'v[0-9]+.[0-9]+.[0-9]+*' ] + +jobs: + publish: + if: ${{ github.repository_owner == 'dart-lang' }} + uses: dart-lang/ecosystem/.github/workflows/publish.yaml@main diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d7399a..c365b84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 4.1.1 + +- Updated the readme to indicate that this package is deprecated (see #185). +- Require Dart 2.19. + ## 4.1.0 - Analytics hits can now be batched. See details in the documentation of the `AnalyticsIO` constructor. diff --git a/README.md b/README.md index 301b4f8..9251b98 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,28 @@ A wrapper around Google Analytics for command-line, web, and Flutter apps. +## UPDATE: Intent to deprecate + +As an update for consumers of this package, we intend to deprecate +`package:usage`. https://github.com/dart-lang/usage/issues/185 has details and +discussion, but briefly: + +- this package uses the older Universal Analytics protocol to record hits to + Google Analytics +- Universal Analytics properties will stop processing new hits on July 1, 2023 +- this library does not support the newer GA4 protocol +- we (the Dart team) originally built this package for our own use, but we're no + longer consuming it + +Clients who want to record hits to Google Analytics could: + +- for web clients, wrapping the gtags.js library is a good solution +- for native clients, sending hits to the new protocol is not much more + difficult than sending HTTP POSTs to the right endpoint + +See also https://github.com/dart-lang/usage/issues/185 other potential +remediations. + ## For web apps To use this library as a web app, import the `usage_html.dart` library and diff --git a/analysis_options.yaml b/analysis_options.yaml index 8f13782..74520cd 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,30 +1,6 @@ -include: package:lints/recommended.yaml +include: package:dart_flutter_team_lints/analysis_options.yaml analyzer: language: - strict-casts: true strict-inference: true strict-raw-types: true - -linter: - rules: - - always_declare_return_types - - avoid_unused_constructor_parameters - - cancel_subscriptions - - directives_ordering - - lines_longer_than_80_chars - - literal_only_boolean_expressions - - missing_whitespace_between_adjacent_strings - - no_adjacent_strings_in_list - - no_runtimeType_toString - - omit_local_variable_types - - package_api_docs - - prefer_relative_imports - - prefer_single_quotes - - test_types_in_equals - - throw_in_finally - - type_annotate_public_apis - - unawaited_futures - - unnecessary_await_in_return - - unnecessary_lambdas - - use_super_parameters diff --git a/lib/src/usage_impl.dart b/lib/src/usage_impl.dart index 51a2b9a..756a2eb 100644 --- a/lib/src/usage_impl.dart +++ b/lib/src/usage_impl.dart @@ -49,7 +49,7 @@ class ThrottlingBucket { if (_lastReplenish + 1000 < now) { final inc = (now - _lastReplenish) ~/ 1000; drops = math.min(drops + inc, startingCount); - _lastReplenish += (1000 * inc); + _lastReplenish += 1000 * inc; } } } diff --git a/lib/src/usage_impl_html.dart b/lib/src/usage_impl_html.dart index cd46c52..212b654 100644 --- a/lib/src/usage_impl_html.dart +++ b/lib/src/usage_impl_html.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; -import 'dart:convert' show jsonEncode, jsonDecode; +import 'dart:convert' show jsonDecode, jsonEncode; import 'dart:html'; import 'usage_impl.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 4768a89..188195d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,17 +3,17 @@ # BSD-style license that can be found in the LICENSE file. name: usage -version: 4.1.0 +version: 4.1.1 description: A Google Analytics wrapper for command-line, web, and Flutter apps. repository: https://github.com/dart-lang/usage environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=2.19.0 <3.0.0' dependencies: meta: ^1.7.0 path: ^1.8.0 dev_dependencies: - lints: '>=1.0.0 <3.0.0' + dart_flutter_team_lints: ^1.0.0 test: ^1.16.0 diff --git a/test/all.dart b/test/all.dart index 9f93051..f3ceb95 100644 --- a/test/all.dart +++ b/test/all.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library usage.all_test; - import 'hit_types_test.dart' as hit_types_test; import 'usage_impl_io_test.dart' as usage_impl_io_test; import 'usage_impl_test.dart' as usage_impl_test; diff --git a/test/hit_types_test.dart b/test/hit_types_test.dart index a8d8da9..4e11d3e 100644 --- a/test/hit_types_test.dart +++ b/test/hit_types_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library usage.hit_types_test; - import 'dart:async'; import 'dart:convert'; @@ -144,7 +142,8 @@ void defineTests() { var mock = createMock(); await mock .sendException('foo bar (file:///Users/foobar/tmp/error.dart:3:13)'); - expect(jsonDecode(mock.last)['exd'], 'foo bar ('); + expect( + (jsonDecode(mock.last) as Map)['exd'], 'foo bar ('); }); }); } diff --git a/test/src/common.dart b/test/src/common.dart index aa440e4..9130761 100644 --- a/test/src/common.dart +++ b/test/src/common.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library usage.common_test; - import 'dart:async'; import 'dart:convert'; @@ -13,9 +11,12 @@ import 'package:usage/src/usage_impl.dart'; AnalyticsImplMock createMock({Map? props}) => AnalyticsImplMock('UA-0', props: props); -void was(String m, String type) => expect(jsonDecode(m)['t'], type); -void has(String m, String key) => expect(jsonDecode(m)[key], isNotNull); -void hasnt(String m, String key) => expect(jsonDecode(m)[key], isNull); +void was(String m, String type) => + expect((jsonDecode(m) as Map)['t'], type); +void has(String m, String key) => + expect((jsonDecode(m) as Map)[key], isNotNull); +void hasnt(String m, String key) => + expect((jsonDecode(m) as Map)[key], isNull); class AnalyticsImplMock extends AnalyticsImpl { MockProperties get mockProperties => properties as MockProperties; diff --git a/test/usage_impl_test.dart b/test/usage_impl_test.dart index 50924a8..9182e93 100644 --- a/test/usage_impl_test.dart +++ b/test/usage_impl_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library usage.impl_test; - import 'package:test/test.dart'; import 'package:usage/src/usage_impl.dart'; diff --git a/test/usage_test.dart b/test/usage_test.dart index 0672265..b679527 100644 --- a/test/usage_test.dart +++ b/test/usage_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library usage.usage_test; - import 'package:test/test.dart'; import 'package:usage/usage.dart'; diff --git a/test/uuid_test.dart b/test/uuid_test.dart index 8894568..187dc64 100644 --- a/test/uuid_test.dart +++ b/test/uuid_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library usage.uuid_test; - import 'package:test/test.dart'; import 'package:usage/uuid/uuid.dart';