Skip to content

Commit

Permalink
Moving things around for cleaner dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
ericmartineau committed Dec 18, 2020
1 parent f107898 commit ae78984
Show file tree
Hide file tree
Showing 26 changed files with 176 additions and 140 deletions.
3 changes: 3 additions & 0 deletions lib/extensions/iterable_stream_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@ import 'dart:async';
import 'package:stream_transform/stream_transform.dart';
import 'package:sunny_dart/sunny_dart.dart';
import 'package:sunny_dart/typedefs.dart';
import 'package:chunked_stream/chunked_stream.dart';

extension StreamExt<T> on Stream<T> {
Future<void> complete() {
return this.drain();
}

Stream<List<T>> chunked(int chunkSize) => asChunkedStream(chunkSize, this);

Stream<E> mapAsyncLimited<E>(FutureOr<E> convert(T event),
{int maxPending = 1}) {
StreamController<E> output;
Expand Down
39 changes: 29 additions & 10 deletions lib/extensions/lang_extensions.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
//ignore_for_file: unnecessary_cast
import 'dart:async';
import 'dart:math';
import 'dart:math' as math;

import 'package:crypto/crypto.dart' as crypto;
import 'package:flutter/material.dart';
import 'package:chunked_stream/chunked_stream.dart';
import 'package:inflection2/inflection2.dart' as inflection;
import 'package:intl/intl.dart';
import 'package:logging/logging.dart';
Expand Down Expand Up @@ -203,8 +204,26 @@ extension NumExt on num {
return min(upper.toDouble(), max(low.toDouble(), this.toDouble()));
}

static const suffixes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];

static String _defaultFormatBytes(num v, int power) {
return "${v.formatCompact()} ${suffixes[power]}";
}

String formatBytes(
{String formatBytes(num v, int power) = NumExt._defaultFormatBytes}) {
assert(formatBytes != null);
var bytes = this;
if (bytes <= 0) return formatBytes(0, 0);
var i = (log(bytes) / log(1024)).floor();
var b = ((bytes / pow(1024, i)));
return formatBytes(b, i);
}

String formatCurrency() => currencyFormat.format(this);

String formatCompact() => compactFormat.format(this);

double times(num other) {
if (this == null) return null;
if (other == null) return this.toDouble();
Expand All @@ -217,6 +236,7 @@ extension NumExt on num {
}

final currencyFormat = NumberFormat.simpleCurrency();
final compactFormat = NumberFormat.compactLong();

extension ModelMapExtensions on Map<String, dynamic> {
Map<String, dynamic> orEmpty() => <String, dynamic>{};
Expand Down Expand Up @@ -275,8 +295,6 @@ extension StringExtensions on String {
return "${this}$after";
}

Color toColor() => colorFromHex(this);

Uri toUri() => this == null ? null : Uri.parse(this);

String nullIfBlank() {
Expand Down Expand Up @@ -570,6 +588,10 @@ extension SunnyIterableExtensionExt<T> on Iterable<T> {
return this;
}

Stream<List<T>> chunkedStream(int chunkSize) {
return asChunkedStream(chunkSize, Stream.fromIterable(this ?? <T>[]));
}

T random() {
if (this == null || this.isEmpty) return null;
final randomIdx = _random.nextInt(this.length);
Expand Down Expand Up @@ -755,6 +777,10 @@ extension CoreListExtension<T> on List<T> {
});
}

Stream<List<T>> chunkedStream(int chunkSize) {
return asChunkedStream(chunkSize, Stream.fromIterable(this ?? <T>[]));
}

Iterable<T> get iterable => this as Iterable<T>;

T tryGet(int index) {
Expand Down Expand Up @@ -958,13 +984,6 @@ extension DateTimeExtensions on DateTime {

bool get isPast => this != null && this.isBefore(DateTime.now());

TZDateTime withTimeZone([Location location]) {
assert(location != null);
if (this is TZDateTime) return (this as TZDateTime);
return TZDateTime.from(
this, location ?? SunnyLocalization.userLocationOrNull);
}

DateTime atStartOfDay() {
final t = this;
if (t == null) return null;
Expand Down
1 change: 0 additions & 1 deletion lib/flutter_extensions.dart

This file was deleted.

6 changes: 6 additions & 0 deletions lib/flutter_extensions/color_extensions.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import 'dart:ui';
import 'colors.dart';

extension StringToColorExtensions on String {
Color toColor() => colorFromHex(this);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:flutter/rendering.dart';
import 'dart:ui';

/// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#".
Color colorFromHex(String hexString) {
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,31 +1,16 @@
import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter_native_timezone/flutter_native_timezone.dart';
import 'package:sunny_dart/time/time_span.dart';
import 'package:timezone/timezone.dart';

Location locationOf(name) {
return sunnyLocalization.locationOf(name?.toString());
}

TimeZone timeZoneOf(name) {
return sunnyLocalization.timeZoneOf(name?.toString());
}
import '../platform/platform_interface.dart'
if (dart.library.io) '../platform/platform_native.dart'
if (dart.library.js) '../platform/platform_web.dart';

DateTime dateTimeOf(json) {
if (json == null) return null;
return DateTime.parse(json.toString());
}

Uri uriOf(json) {
if (json == null) return null;
return Uri.parse(json.toString());
}

TimeSpan timeSpanOf(String duration) {
return TimeSpan.ofISOString(duration);
Future initializeTimeZones() async {
final byteData = await rootBundle.load('packages/timezone/data/latest.tzf');
final rawData = byteData.buffer.asUint8List();
initializeDatabase(rawData);
}

Completer<SunnyLocalization> _sunnyLocalizationCompleter;
Expand All @@ -37,6 +22,14 @@ Future<SunnyLocalization> get sunnyLocalizationFuture {
}
}

Location locationOf(name) {
return sunnyLocalization.locationOf(name?.toString());
}

TimeZone timeZoneOf(name) {
return sunnyLocalization.timeZoneOf(name?.toString());
}

SunnyLocalization _sunnyLocalization;
SunnyLocalization get sunnyLocalization {
assert(_sunnyLocalization != null,
Expand All @@ -47,12 +40,8 @@ SunnyLocalization get sunnyLocalization {
Future<SunnyLocalization> _loadSunnyLocalization() async {
_sunnyLocalizationCompleter ??= Completer<SunnyLocalization>();
if (_sunnyLocalization != null) return _sunnyLocalization;
final userTimeZoneName = (kIsWeb)
? "America/Chicago"
: await FlutterNativeTimezone.getLocalTimezone();
final byteData = await rootBundle.load('packages/timezone/data/latest.tzf');
final rawData = byteData.buffer.asUint8List();
initializeDatabase(rawData);
final userTimeZoneName = await currentUserTimeZone;

final userLocation = getLocation(userTimeZoneName);
final userTimeZone = userLocation.currentTimeZone;
_sunnyLocalization = SunnyLocalization(userTimeZone, userLocation);
Expand Down Expand Up @@ -91,3 +80,12 @@ extension SunnyLocalizationExt on Future<SunnyLocalization> {
Future<TimeZone> get userTimeZone => then((_) => _.userTimeZone);
Future<Location> get userLocation => then((_) => _.userLocation);
}

extension LocalizationDateTimeExt on DateTime {
TZDateTime withTimeZone([Location location]) {
assert(location != null);
if (this is TZDateTime) return (this as TZDateTime);
return TZDateTime.from(
this, location ?? SunnyLocalization.userLocationOrNull);
}
}
3 changes: 1 addition & 2 deletions lib/helpers.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
library helpers;

export 'helpers/colors.dart';
export 'helpers/disposable.dart';
export 'helpers/functions.dart';
export 'helpers/hash_codes.dart';
export 'helpers/coercions.dart';
export 'helpers/ints.dart';
export 'helpers/lists.dart';
export 'helpers/logging_mixin.dart';
export 'helpers/maps.dart';
export 'helpers/phone_numbers.dart';
export 'helpers/safe_completer.dart';
export 'helpers/strings.dart';
export 'helpers/tuple.dart';
Expand Down
15 changes: 15 additions & 0 deletions lib/helpers/coercions.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:sunny_dart/time/time_span.dart';

DateTime dateTimeOf(json) {
if (json == null) return null;
return DateTime.parse(json.toString());
}

Uri uriOf(json) {
if (json == null) return null;
return Uri.parse(json.toString());
}

TimeSpan timeSpanOf(String duration) {
return TimeSpan.ofISOString(duration);
}
5 changes: 1 addition & 4 deletions lib/helpers/functions.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import 'dart:async';

import 'package:flutter/widgets.dart';
import 'package:logging/logging.dart';
import 'package:sunny_dart/typedefs.dart';

import '../platform/platform_interface.dart'
if (dart.library.io) '../platform/platform_native.dart'
if (dart.library.html) '../platform/platform_web.dart';
if (dart.library.js) '../platform/platform_web.dart';

final _log = Logger("functions");

Expand All @@ -25,8 +24,6 @@ class Functions {
}
return null;
}

static WidgetBuilder ofStatic(Widget widget) => (context) => widget;
}

Factory<T> returnNull<T>() => () => null;
Expand Down
30 changes: 25 additions & 5 deletions lib/helpers/lists.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/widgets.dart';
import 'package:logging/logging.dart';

import 'package:meta/meta.dart';
import '../typedefs.dart';
import 'functions.dart';
import 'dart:collection';

final _log = Logger("Lists");

Expand Down Expand Up @@ -220,9 +220,6 @@ T wrongType<T>(String name, value, List<Type> accepted) =>
throw ArgumentError.value(value, name,
"Wrong type (${value?.runtimeType}) - expected one of $accepted");

Widget widgetIf(bool condition, Factory<Widget> factory) =>
condition ? factory() : Container();

List<T> removeElement<T>(Iterable<T> elements, T toRemove) =>
elements?.where((item) => item != toRemove)?.toList() ?? [];

Expand All @@ -249,3 +246,26 @@ Map<String, T> toMap<T>(value, DynTransformer<T> txr) {
throw ArgumentError("Expected map value");
}
}

abstract class ListDelegateMixin<T> extends ListMixin<T> {
List<T> get delegate;

@override
Iterator<T> get iterator => delegate.iterator;

@override
int get length => delegate.length;

@override
set length(int length) => delegate.length = length;

@override
T operator [](int index) {
return delegate[index];
}

@override
void operator []=(int index, T value) {
delegate[index] = value;
}
}
2 changes: 1 addition & 1 deletion lib/helpers/maps.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import '../helpers.dart';
import '../json.dart';
import 'functions.dart';

class Maps {
Maps._();
Expand Down
3 changes: 1 addition & 2 deletions lib/helpers/strings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ import 'dart:math';
import 'dart:typed_data';

import 'package:crypto/crypto.dart' as crypto;
import 'package:flutter/foundation.dart';
import 'package:uuid/uuid.dart';

import 'package:meta/meta.dart';
import 'lists.dart';

bool isPhone(String input) {
Expand Down
13 changes: 11 additions & 2 deletions lib/json/json_path.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ class JsonPath<T> extends MLiteral<String> {
/// The last segment in the path
String get last => segments.last;

/// The first segment in the path
String get first => segments.first;

int get length => segments.length;

/// Whether this path starts with another [JsonPath] instance.
bool startsWith(JsonPath otherPath) {
return path.startsWith(otherPath.path);
Expand Down Expand Up @@ -105,8 +110,12 @@ List<String> _parsePath(String path) {
String _toPathName(Iterable<String> segments) => "/" + segments.join("/");

extension JsonPathOperatorExtensions<T> on JsonPath<T> {
JsonPath operator +(JsonPath path) {
return self.plus(path.self);
JsonPath operator +(path) {
if (path is JsonPath) {
return self.plus(path.self);
} else {
return self.plus(JsonPath.of(path));
}
}

/// Whether this path is empty, eg "/"
Expand Down
8 changes: 2 additions & 6 deletions lib/platform/device_info.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:meta/meta.dart';
import 'package:sunny_dart/helpers/strings.dart';

import '../extensions.dart';
import 'platform_interface.dart'
if (dart.library.io) 'platform_native.dart'
if (dart.library.html) 'platform_web.dart';
if (dart.library.js) 'platform_web.dart';

enum BuildMode { release, profile, debug }

Expand Down Expand Up @@ -104,7 +104,3 @@ extension PlatformInfoFuture on FutureOr<DeviceInfo> {

Future<String> get softwareVersion async => (await this).softwareVersion;
}

const buildMode = bool.fromEnvironment('dart.vm.product')
? BuildMode.release
: kDebugMode ? BuildMode.debug : BuildMode.profile;
14 changes: 1 addition & 13 deletions lib/platform/platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,10 @@ bool get isPlatformWindows => throw "Not implemented";
bool get isPlatformLinux => throw "Not implemented";
bool get isPlatformWeb => throw "Not implemented";
String get platformName => throw "Not implemented";
Future<String> get currentUserTimeZone => throw "Not implemented";

Map<String, String> get platformEnvironment => throw "Not implemented";

bool get canPlatformReadFiles => throw "Not implemented";

abstract class File {
factory File(String path) => throw "Not implemented: $path";
File get absolute;
bool existsSync();
String readAsStringSync();
void writeAsStringSync(String data);
Uint8List readAsBytesSync();
int lengthSync();
Stream<List<int>> openRead();
String get path;
void writeAsBytesSync(List<int> bytes, {bool flush = false});
}

Future<DeviceInfo> loadPlatformInfo() => throw "Not implemented";

0 comments on commit ae78984

Please sign in to comment.