Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Unified Diff: usage/lib/usage.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « usage/lib/src/uuid.dart ('k') | usage/lib/usage_html.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
-}
« no previous file with comments | « usage/lib/src/uuid.dart ('k') | usage/lib/usage_html.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698