| Index: usage/lib/usage.dart
|
| diff --git a/usage/lib/usage.dart b/usage/lib/usage.dart
|
| deleted file mode 100644
|
| index 9a4279bbe37cbfcd418128a5cb15b154d3f6acc5..0000000000000000000000000000000000000000
|
| --- a/usage/lib/usage.dart
|
| +++ /dev/null
|
| @@ -1,250 +0,0 @@
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| -// 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.
|
| -
|
| -/**
|
| - * `usage` is a wrapper around Google Analytics for both command-line apps
|
| - * and web apps.
|
| - *
|
| - * In order to use this library as a web app, import the `analytics_html.dart`
|
| - * library and instantiate the [AnalyticsHtml] class.
|
| - *
|
| - * In order to use this library as a command-line app, import the
|
| - * `analytics_io.dart` library and instantiate the [AnalyticsIO] class.
|
| - *
|
| - * For both classes, you need to provide a Google Analytics tracking ID, the
|
| - * application name, and the application version.
|
| - *
|
| - * Your application should provide an opt-in option for the user. If they
|
| - * opt-in, set the [optIn] field to `true`. This setting will persist across
|
| - * sessions automatically.
|
| - *
|
| - * For more information, please see the Google Analytics Measurement Protocol
|
| - * [Policy](https://developers.google.com/analytics/devguides/collection/protocol/policy).
|
| - */
|
| -library usage;
|
| -
|
| -import 'dart:async';
|
| -
|
| -// Matches file:/, non-ws, /, non-ws, .dart
|
| -final RegExp _pathRegex = new RegExp(r'file:/\S+/(\S+\.dart)');
|
| -
|
| -/**
|
| - * An interface to a Google Analytics session. [AnalyticsHtml] and [AnalyticsIO]
|
| - * are concrete implementations of this interface. [AnalyticsMock] can be used
|
| - * for testing or for some varients of an opt-in workflow.
|
| - *
|
| - * The analytics information is sent on a best-effort basis. So, failures to
|
| - * send the GA information will not result in errors from the asynchronous
|
| - * `send` methods.
|
| - */
|
| -abstract class Analytics {
|
| - /**
|
| - * Tracking ID / Property ID.
|
| - */
|
| - String get trackingId;
|
| -
|
| - /**
|
| - * Whether the user has opt-ed in to additional analytics.
|
| - */
|
| - bool optIn;
|
| -
|
| - /**
|
| - * Whether the [optIn] value has been explicitly set (either `true` or
|
| - * `false`).
|
| - */
|
| - bool get hasSetOptIn;
|
| -
|
| - /**
|
| - * Sends a screen view hit to Google Analytics.
|
| - */
|
| - Future sendScreenView(String viewName);
|
| -
|
| - /**
|
| - * Sends an Event hit to Google Analytics. [label] specifies the event label.
|
| - * [value] specifies the event value. Values must be non-negative.
|
| - */
|
| - Future sendEvent(String category, String action, {String label, int value});
|
| -
|
| - /**
|
| - * Sends a Social hit to Google Analytics. [network] specifies the social
|
| - * network, for example Facebook or Google Plus. [action] specifies the social
|
| - * interaction action. For example on Google Plus when a user clicks the +1
|
| - * button, the social action is 'plus'. [target] specifies the target of a
|
| - * social interaction. This value is typically a URL but can be any text.
|
| - */
|
| - Future sendSocial(String network, String action, String target);
|
| -
|
| - /**
|
| - * Sends a Timing hit to Google Analytics. [variableName] specifies the
|
| - * variable name of the timing. [time] specifies the user timing value (in
|
| - * milliseconds). [category] specifies the category of the timing. [label]
|
| - * specifies the label of the timing.
|
| - */
|
| - Future sendTiming(String variableName, int time, {String category,
|
| - String label});
|
| -
|
| - /**
|
| - * Start a timer. The time won't be calculated, and the analytics information
|
| - * sent, until the [AnalyticsTimer.finish] method is called.
|
| - */
|
| - AnalyticsTimer startTimer(String variableName,
|
| - {String category, String label});
|
| -
|
| - /**
|
| - * In order to avoid sending any personally identifying information, the
|
| - * [description] field must not contain the exception message. In addition,
|
| - * only the first 100 chars of the description will be sent.
|
| - */
|
| - Future sendException(String description, {bool fatal});
|
| -
|
| - /**
|
| - * Sets a session variable value. The value is persistent for the life of the
|
| - * [Analytics] instance. This variable will be sent in with every analytics
|
| - * hit. A list of valid variable names can be found here:
|
| - * https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters.
|
| - */
|
| - void setSessionValue(String param, dynamic value);
|
| -
|
| - /**
|
| - * Wait for all of the outstanding analytics pings to complete. The returned
|
| - * `Future` will always complete without errors. You can pass in an optional
|
| - * `Duration` to specify to only wait for a certain amount of time.
|
| - *
|
| - * This method is particularly useful for command-line clients. Outstanding
|
| - * I/O requests will cause the VM to delay terminating the process. Generally,
|
| - * users won't want their CLI app to pause at the end of the process waiting
|
| - * for Google analytics requests to complete. This method allows CLI apps to
|
| - * delay for a short time waiting for GA requests to complete, and then do
|
| - * something like call `exit()` explicitly themselves.
|
| - */
|
| - Future waitForLastPing({Duration timeout});
|
| -}
|
| -
|
| -/**
|
| - * An object, returned by [Analytics.startTimer], that is used to measure an
|
| - * asynchronous process.
|
| - */
|
| -class AnalyticsTimer {
|
| - final Analytics analytics;
|
| - final String variableName;
|
| - final String category;
|
| - final String label;
|
| -
|
| - int _startMillis;
|
| - int _endMillis;
|
| -
|
| - AnalyticsTimer(this.analytics, this.variableName,
|
| - {this.category, this.label}) {
|
| - _startMillis = new DateTime.now().millisecondsSinceEpoch;
|
| - }
|
| -
|
| - int get currentElapsedMillis {
|
| - if (_endMillis == null) {
|
| - return new DateTime.now().millisecondsSinceEpoch - _startMillis;
|
| - } else {
|
| - return _endMillis - _startMillis;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Finish the timer, calculate the elapsed time, and send the information to
|
| - * analytics. Once this is called, any future invocations are no-ops.
|
| - */
|
| - Future finish() {
|
| - if (_endMillis != null) return new Future.value();
|
| -
|
| - _endMillis = new DateTime.now().millisecondsSinceEpoch;
|
| - return analytics.sendTiming(
|
| - variableName, currentElapsedMillis, category: category, label: label);
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * A no-op implementation of the [Analytics] class. This can be used as a
|
| - * stand-in for that will never ping the GA server, or as a mock in test code.
|
| - */
|
| -class AnalyticsMock implements Analytics {
|
| - String get trackingId => 'UA-0';
|
| - final bool logCalls;
|
| -
|
| - bool optIn = false;
|
| - bool hasSetOptIn = true;
|
| -
|
| - /**
|
| - * Create a new [AnalyticsMock]. If [logCalls] is true, all calls will be
|
| - * logged to stdout.
|
| - */
|
| - AnalyticsMock([this.logCalls = false]);
|
| -
|
| - Future sendScreenView(String viewName) =>
|
| - _log('screenView', {'viewName': viewName});
|
| -
|
| - Future sendEvent(String category, String action, {String label, int value}) {
|
| - return _log('event', {'category': category, 'action': action,
|
| - 'label': label, 'value': value});
|
| - }
|
| -
|
| - Future sendSocial(String network, String action, String target) =>
|
| - _log('social', {'network': network, 'action': action, 'target': target});
|
| -
|
| - Future sendTiming(String variableName, int time, {String category,
|
| - String label}) {
|
| - return _log('timing', {'variableName': variableName, 'time': time,
|
| - 'category': category, 'label': label});
|
| - }
|
| -
|
| - AnalyticsTimer startTimer(String variableName,
|
| - {String category, String label}) {
|
| - return new AnalyticsTimer(this,
|
| - variableName, category: category, label: label);
|
| - }
|
| -
|
| - Future sendException(String description, {bool fatal}) =>
|
| - _log('exception', {'description': description, 'fatal': fatal});
|
| -
|
| - void setSessionValue(String param, dynamic value) { }
|
| -
|
| - Future waitForLastPing({Duration timeout}) => new Future.value();
|
| -
|
| - Future _log(String hitType, Map m) {
|
| - if (logCalls) {
|
| - print('analytics: ${hitType} ${m}');
|
| - }
|
| -
|
| - return new Future.value();
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Sanitize a stacktrace. This will shorten file paths in order to remove any
|
| - * PII that may be contained in the full file path. For example, this will
|
| - * shorten `file:///Users/foobar/tmp/error.dart` to `error.dart`.
|
| - *
|
| - * If [shorten] is `true`, this method will also attempt to compress the text
|
| - * of the stacktrace. GA has a 100 char limit on the text that can be sent for
|
| - * an exception. This will try and make those first 100 chars contain
|
| - * information useful to debugging the issue.
|
| - */
|
| -String sanitizeStacktrace(dynamic st, {bool shorten: true}) {
|
| - String str = '${st}';
|
| -
|
| - Iterable<Match> iter = _pathRegex.allMatches(str);
|
| - iter = iter.toList().reversed;
|
| -
|
| - for (Match match in iter) {
|
| - String replacement = match.group(1);
|
| - str = str.substring(0, match.start)
|
| - + replacement + str.substring(match.end);
|
| - }
|
| -
|
| - if (shorten) {
|
| - // Shorten the stacktrace up a bit.
|
| - str = str
|
| - .replaceAll('(package:', '(')
|
| - .replaceAll('(dart:', '(')
|
| - .replaceAll(new RegExp(r'\s+'), ' ');
|
| - }
|
| -
|
| - return str;
|
| -}
|
|
|