Compare commits

...
Author SHA1 Message Date
johncolvin-og ea4e599ac6 fix build: Fix a few path errors in publish target 2023-05-31 21:59:51 -04:00
Taha fd2ba70031 Culling the logs 2023-05-29 11:35:49 -04:00
Taha ab410c339f Order Tickets from the sheets are defaulted correctly now 2023-05-29 10:32:29 -04:00
John Colvin 9e3f16d8bc fix build: Update externals so prod builds in new docker 2023-04-05 11:45:24 -04:00
John Colvin a3f194d708 build (web): Upgrade web build to net7.0 2023-04-05 11:39:37 -04:00
John Colvin bf87c46fcd fix build: Remove inappropriate ThreadStatic attr
This has likely been incorrect for a while. The problem surfaced after
upgrading to net7.0, as the new framework emits a warning (CA2259) when the
attribute is associated with a non-static field.
2023-03-07 16:30:59 -05:00
John Colvin 222d4b266e build: Disable warning cs8981
This is a new warning, introduced in net7.0, that disallows lowercase
class names. Our spark_crypto.prod branch currently uses protoc v3.19.1,
which is incompatible with this new warning, as it generates
classes with lowercase names. We can re-enable the warning when we
upgrade protoc to 3.21.12 (this has been done in the api server branch).
2023-03-07 16:25:21 -05:00
John Colvin d593eaf058 build: Upgrade TargetFramework to net7.0
We've been using several net7.0 preview features for a while now. Now that a
stable net7.0 release is available, it is time upgrade officially. This also
aids the effort to build csharp on Linux, where these preview features didn't
work out of the box. Lastly, trying to make these preview features work would
be a waste of time, as namespaces/interfaces in the official release have
changed in a way that isn't backwards compatible w/ the preview features.
2023-03-07 16:17:39 -05:00
John Colvin 55d021ccb1 fix build (publish): Copy libspark.dll to publish dir
Bugs (fixed):
  * Spark.exe generated by the installer crashes immediately on launch because
    it cannot find the libspark.dll.

  Cause: Sure enough, libspark.dll isn't in the install folder
  (AppData\Roaming\bts\Spark)

* Build libspark explicitly
* Fix libspark.dll copy src path
2023-02-07 16:41:11 -05:00
56 changed files with 6051 additions and 5163 deletions

No files matched your search

+18
View File
@@ -7,6 +7,24 @@
"commands": [
"dotnet-format"
]
},
"fable": {
"version": "4.0.0-theta-018",
"commands": [
"fable"
]
},
"fantomas": {
"version": "5.2.2",
"commands": [
"fantomas"
]
},
"fake-cli": {
"version": "6.0.0",
"commands": [
"fake"
]
}
}
}
+55 -53
View File
@@ -1,53 +1,55 @@
<Project>
<PropertyGroup>
<ComputerSpecificConfig>..\..\tools\override\$(computername).props</ComputerSpecificConfig>
<SparkRoot>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)\..\..))</SparkRoot>
<SourceRoot>$([System.IO.Path]::GetFullPath($(SparkRoot)\src))</SourceRoot>
<Externals>$(SparkRoot)\externals\windows</Externals>
<DepotName>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetFullPath($(SparkRoot)))))</DepotName>
<ErrorReport>None</ErrorReport>
<Prefer32Bit>False</Prefer32Bit>
<Deterministic>true</Deterministic>
<EnableDefaultContentItems>False</EnableDefaultContentItems>
<ShowMissingItemTypes>false</ShowMissingItemTypes>
<Configuration Condition="'$(configuration)'==''">Debug</Configuration>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<PropertyGroup Label="Output">
<BaseOutputPath>$(SparkRoot)\build\$(Configuration)</BaseOutputPath>
<OutputPath>$(BaseOutputPath)\bin</OutputPath>
<BaseIntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
<IntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</IntermediateOutputPath>
<GenDir>$(BaseOutputPath)\gen\$(MSBuildProjectName)</GenDir>
</PropertyGroup>
<Import
Project="$(ComputerSpecificConfig)"
Condition="Exists($(ComputerSpecificConfig))" />
<PropertyGroup Label="ProtoBuf">
<ProtocPluginBase>$(SparkRoot)\src\lib\api\service_compiler</ProtocPluginBase>
<protoc>$(Externals)\bin\protoc.exe</protoc>
<protogen>$(Externals)\bin\protogen.exe</protogen>
</PropertyGroup>
<ItemDefinitionGroup>
<Proto2></Proto2>
<Proto3>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCS>%(OutBase)%(FileName).cs</OutCS>
<OutCSClient>%(OutBase)%(FileName).client.pb.cs</OutCSClient>
<OutCSServer>%(OutBase)%(FileName).server.pb.cs</OutCSServer>
<OutCSImmutable>%(OutBase)%(FileName).immutable.pb.cs</OutCSImmutable>
<CompileOptions></CompileOptions>
</Proto3>
<Proto3Excel>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCSExcel>%(OutBase)%(FileName).excel.pb.cs</OutCSExcel>
<CompileOptions></CompileOptions>
</Proto3Excel>
</ItemDefinitionGroup>
</Project>
<Project>
<PropertyGroup>
<ComputerSpecificConfig>..\..\tools\override\$(computername).props</ComputerSpecificConfig>
<SparkRoot>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)\..\..))</SparkRoot>
<SourceRoot>$([System.IO.Path]::GetFullPath($(SparkRoot)\src))</SourceRoot>
<Externals>$(SparkRoot)\externals\windows</Externals>
<DepotName>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetFullPath($(SparkRoot)))))</DepotName>
<ErrorReport>None</ErrorReport>
<Prefer32Bit>False</Prefer32Bit>
<Deterministic>true</Deterministic>
<EnableDefaultContentItems>False</EnableDefaultContentItems>
<ShowMissingItemTypes>false</ShowMissingItemTypes>
<Configuration Condition="'$(configuration)'==''">Debug</Configuration>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<LangVersion>11</LangVersion>
</PropertyGroup>
<PropertyGroup Label="Output">
<BaseOutputPath>$(SparkRoot)\build\$(Configuration)</BaseOutputPath>
<OutputPath>$(BaseOutputPath)\bin</OutputPath>
<BaseIntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
<IntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</IntermediateOutputPath>
<ProtoOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</ProtoOutputPath>
<GenDir>$(BaseOutputPath)\gen\$(MSBuildProjectName)</GenDir>
</PropertyGroup>
<Import
Project="$(ComputerSpecificConfig)"
Condition="Exists($(ComputerSpecificConfig))" />
<PropertyGroup Label="ProtoBuf">
<ProtocPluginBase>$(SparkRoot)\src\lib\api\service_compiler</ProtocPluginBase>
<protoc>$(Externals)\bin\protoc.exe</protoc>
<protogen>$(Externals)\bin\protogen.exe</protogen>
</PropertyGroup>
<ItemDefinitionGroup>
<Proto2></Proto2>
<Proto3>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCS>%(OutBase)%(FileName).cs</OutCS>
<OutCSClient>%(OutBase)%(FileName).client.pb.cs</OutCSClient>
<OutCSServer>%(OutBase)%(FileName).server.pb.cs</OutCSServer>
<OutCSImmutable>%(OutBase)%(FileName).immutable.pb.cs</OutCSImmutable>
<CompileOptions></CompileOptions>
</Proto3>
<Proto3Excel>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCSExcel>%(OutBase)%(FileName).excel.pb.cs</OutCSExcel>
<CompileOptions></CompileOptions>
</Proto3Excel>
</ItemDefinitionGroup>
</Project>
@@ -63,9 +63,9 @@ namespace mbts.spark {
vs_input, vs_nonvol_data.contracts, aux_data_map);
_timer.stop();
var tag_str = tag == null ? "Null" : tag.ToString();
bts.Log.Gen.info($"SingleVolSurfaceCommittedOutputRetriever._recompute_and_publish " +
$"vs_id: {_vs_id} time:{_timer.lastIntervalTime} ms tag:{tag_str} " +
$"tid:{_tid()}"); //output: {vs_output.log_string()}*/");
// bts.Log.Gen.info($"SingleVolSurfaceCommittedOutputRetriever._recompute_and_publish " +
// $"vs_id: {_vs_id} time:{_timer.lastIntervalTime} ms tag:{tag_str} " +
// $"tid:{_tid()}"); //output: {vs_output.log_string()}*/");
_logger.log(_log_id, _log_id, _timer.lastIntervalTime);
_bb.post(_out_bb_computed_vol_tag, vs_output);
}
@@ -75,7 +75,7 @@ namespace mbts.spark {
var exp_price_map = OptionDriverPriceMap.get_vs_price_map(
all_sym_price_map, (s) => _option_symbols.Contains(s));
if (sc_data != null && vs_nonvol_input != null && exp_price_map != null) {
bts.Log.Gen.info($"SingleVolSurfaceNonVolDataSource vs_id:{_vs_id} " +
bts.Log.Gen.diag($"SingleVolSurfaceNonVolDataSource vs_id:{_vs_id} " +
"publishing VolSurfaceNonVolData");
_bb.post(_out_bb_vs_nonvol_data_tag,
new VolSurfaceNonVolData(
@@ -81,7 +81,7 @@ namespace mbts.analytics {
output.Add(symbol, symbol_data);
}
IReadOnlyDictionary<string, TData> ro_output = output;
bts.Log.Gen.info($"SymbolAggregationPublisher._on_timer publishing " +
bts.Log.Gen.diag($"SymbolAggregationPublisher._on_timer publishing " +
$"tag: {_out_tag} sz: {ro_output.Count}");
_bb.post(_out_tag, ro_output);
}
@@ -28,9 +28,10 @@ namespace mbts.spark {
_candidate_value.Changed += on_candidate_changed;
_is_dirty.Changed += (o, n) => {
Log.assert(o != n);
Log.Ui.info(
$"VolSurface '{expiration}.{column}' is_dirty changed to {n}. " +
$"commited: {committed_value}; candidate: {candidate_value}");
// TODO: John, this was logged too many times
// Log.Ui.info(
// $"VolSurface '{expiration}.{column}' is_dirty changed to {n}. " +
// $"commited: {committed_value}; candidate: {candidate_value}");
};
void on_committed_changed(object? oldval, object? newval) =>
@@ -88,8 +88,8 @@ namespace mbts.analytics {
public void set_driver_price(
IDictionary<VolSurfaceExpiration, double> driver_price_map) {
Log.Gen.info($"VolSurfaceInterpGreeksProducer.set_driver_price " +
$"vs_id: {_vs_id} exp_count: {driver_price_map.Count}");
// Log.Gen.info($"VolSurfaceInterpGreeksProducer.set_driver_price " +
// $"vs_id: {_vs_id} exp_count: {driver_price_map.Count}");
_driver_price_map = new Dictionary<VolSurfaceExpiration, double>(driver_price_map);
_compute_and_fire(InputType.DriverPrice);
}
+1 -1
View File
@@ -62,7 +62,7 @@ namespace bts {
}
private void _on_server_sec_map(IReadOnlyDictionary<uint, SecurityMD> sec_map) {
_log_options(sec_map);
//_log_options(sec_map);
bts.Log.Gen.info(String.Format("MergedMDDaemon._on_server_sec_map sz: {0}", sec_map.Count()));
_server_sec_map = new Dictionary<uint, SecurityMD>(sec_map);
_merge_and_post();
@@ -58,5 +58,10 @@ namespace BCG {
public static UInt32 get_ask_size(BBOPacket md) {
return md != null ? md._ask_size : (UInt32)0;
}
public static Tuple<double, UInt32> get_md(BBOPacket md, bool is_bid) {
double price = is_bid ? BBOPacket.get_bid_price(md) : BBOPacket.get_ask_price(md);
UInt32 sz = is_bid ? BBOPacket.get_bid_size(md) : BBOPacket.get_ask_size(md);
return Tuple.Create(price, sz);
}
}
}
@@ -123,6 +123,15 @@ namespace BCG {
#endregion
#region Orders
[System.ComponentModel.Category("Orders / Algo")]
[System.ComponentModel.DisplayName("Default Account")]
public string Account { get; set; }
[System.ComponentModel.Category("Orders / Algo")]
[System.ComponentModel.DisplayName("Default Qty")]
public Nullable<double> DefaultQty { get; set; }
#endregion
public NMSheetSettingLayout() {
show_settings_header = false;
show_exp_navigator = false;
@@ -18,6 +18,7 @@ using mbts.spark.filters;
using System.Collections;
using System.Reactive.Linq;
using System.Threading;
using bts.api.orderman;
namespace BCG {
public partial class NMSheetControl : UserControl {
@@ -555,6 +556,17 @@ namespace BCG {
}
private void _launch_order_entry_window(NMSheetTheoGrid.GridCell cell,
OrderEntryWindow window_type) {
Func<string, bts.AccountTuple> get_account = (string default_acc) => {
string account = _settings.setting_layout.Account;
if (String.IsNullOrEmpty(account)) {
account = default_acc;
}
Nullable<uint> id = _get_account_id(account);
if (!id.HasValue) {
id = 0;
}
return new bts.AccountTuple(id.Value, account);
};
uint key;
var found = _sheet_data.get_security_key(cell.expiration,
cell.strike, cell.call_selected, out key);
@@ -566,7 +578,20 @@ namespace BCG {
if (sc_data.sec_md_map.TryGetValue(key, out var smd)) {
switch (window_type) {
case OrderEntryWindow.Ticket:
_threaded_bb.post(SparkTags.ShowOrderTicketFromSecurityTag, smd);
bool is_bid = NMSheetSettingColumnOrganization.get_column_info(cell.col).is_bid;
bts.AccountTuple acc_tup = get_account("SMALL");
Nullable<double> qty = _settings.setting_layout.DefaultQty;
OrderDefinition od = new OrderDefinition() {
SecurityKey = smd.id,
TimeInForce = TimeInForce.Gtc,
Account = acc_tup.name,
AccountId = acc_tup.id
};
BBOPacket bbo = _sheet_data.get_bbo(smd.id);
Tuple<double, UInt32> pr_sz = BBOPacket.get_md(bbo, is_bid);
UInt32 effective_qty = qty.HasValue ? Convert.ToUInt32(Math.Abs(qty.Value)) : pr_sz.Item2;
_threaded_bb.post(SparkTags.ShowOrderTicketTag,
(new OrderDefinitionImmutable(od), pr_sz.Item1, effective_qty));
break;
case OrderEntryWindow.Ladder:
_threaded_bb.post(SparkTags.ShowLadderTag, smd);
@@ -121,7 +121,7 @@ namespace mbts.analytics {
timer.stop();
Log.Ui.info($"PNLReportCalculator n_pos: {output.position_data.Count()} " +
$"n_day_trades: {output.day_trades.Count()} time(msecs): {timer.lastIntervalTime}");
_log_before_posting(output.position_data);
//_log_before_posting(output.position_data);
_bus.post(SparkTags.ReportBlackboardTags.PNL.PNLData, output);
});
}
@@ -115,21 +115,21 @@ namespace mbts.analytics {
}
private void _handle_nonvol_data(VolSurfaceNonVolData vs_nonvol_data) {
bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_nonvol_data report {0}",
_report.ReportName));
// bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_nonvol_data report {0}",
// _report.ReportName));
_vs_nonvol_data = vs_nonvol_data;
}
private void _handle_future_prices(
IReadOnlyDictionary<SecurityExpiration, FutureTheoStructure> future_prices_map) {
bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_future_prices report {0}",
_report.ReportName));
// bts.Log.Gen.Diag(String.Format("SlideReportCalculator._handle_future_prices report {0}",
// _report.ReportName));
_future_prices_map = future_prices_map.ToDictionary(kv => kv.Key, kv => kv.Value.theo);
}
private void _handle_trades(IEnumerable<ITradeLogRow> trades) {
bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_trades report {0}",
_report.ReportName));
// bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_trades report {0}",
// _report.ReportName));
_all_trades = trades.Where(t => t.is_active);
if (_report.CalcMode == Report.Types.ReportCalculationMode.PositionOrTheoChange) {
_compute_dirty = true;
+1 -2
View File
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<TargetFramework>net7.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<Authors>Blue Trading Systems</Authors>
<Company>Blue Trading Systems</Company>
@@ -34,7 +34,6 @@
<PackageReference Include="System.Reactive.Interfaces" Version="5.0.0" />
<PackageReference Include="System.Reactive.Linq" Version="5.0.0" />
<PackageReference Include="System.Reactive.PlatformServices" Version="5.0.0" />
<PackageReference Include="System.Runtime.Experimental" Version="6.0.2" />
<PackageReference Include="CommandLineParser" Version="2.9.1" />
<ProjectReference Include="../spark_api/spark_api.csproj" />
<ProjectReference Include="../spark_core/spark_core.csproj" />
+2 -2
View File
@@ -35,7 +35,7 @@ namespace bts.core {
// TODO: for debugging purposes, remove it later
if (tag != mbts.spark.SparkTags.SparkTimer) {
var tid = System.Threading.Thread.CurrentThread.ManagedThreadId;
bts.Log.Ui.diag($"SimpleBus.post tag:{tag} tid:{tid}");
//bts.Log.Ui.diag($"SimpleBus.post tag:{tag} tid:{tid}");
return;
}
} catch (Exception e) {
@@ -45,7 +45,7 @@ namespace bts.core {
public IObservable<T> subscribe<T>(ITag<T> tag) {
var tid = System.Threading.Thread.CurrentThread.ManagedThreadId;
bts.Log.Ui.info($"SimpleBus.post tag:{tag} tid:{tid}");
//bts.Log.Ui.info($"SimpleBus.subscribe tag:{tag} tid:{tid}");
return subject<T>(tag);
}
}
@@ -5,6 +5,7 @@ namespace mbts.ui.controls {
using System;
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
static class TickUpDownHelper {
public const string
@@ -13,7 +14,7 @@ namespace mbts.ui.controls {
public static string? format<T>(
T? new_value, string curr_text, TickDisplaySettingsImmutable? settings = null)
where T : struct, IFloatingPoint<T> {
where T : struct, IFloatingPointIeee754<T> {
if (T.TryParse(curr_text, null, out var from_text)) {
if (!from_text.Equals(new_value)) {
return format(new_value, settings);
@@ -25,7 +26,7 @@ namespace mbts.ui.controls {
}
public static string format<T>(T? value, TickDisplaySettingsImmutable? settings = null)
where T : struct, IFloatingPoint<T> {
where T : struct, IFloatingPointIeee754<T> {
if (!value.HasValue) {
return string.Empty;
}
@@ -39,7 +40,7 @@ namespace mbts.ui.controls {
string? text,
[NotNullWhen(true)] out T? result,
TickDisplaySettingsImmutable? settings = null
) where T : IFloatingPoint<T> {
) where T : IFloatingPointIeee754<T> {
if (text is null) {
result = default;
return false;
@@ -11,6 +11,7 @@ namespace mbts.ui.controls {
using System;
using System.Linq;
using System.Numerics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
@@ -3,13 +3,14 @@ using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Windows.Data;
namespace mbts.ui.converters {
class DictionaryLookupConverter : IMultiValueConverter {
[ThreadStatic]
Dictionary<Type, Lookup> _type_impls_backing;
Dictionary<Type, Lookup> _type_impls => _type_impls_backing ?? (_type_impls_backing = new Dictionary<Type, Lookup>());
Dictionary<Type, Lookup> _type_impls =>
Interlocked.CompareExchange(ref _type_impls_backing, new(), null);
delegate bool Lookup(object source, object key, out object result);
@@ -9,6 +9,7 @@
using Spark.Core.Disposables;
using System;
using System.Numerics;
using System.Reactive.Linq;
using System.Windows.Input;
@@ -7,6 +7,7 @@ using Spark.Core.Disposables;
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Reactive.Linq;
namespace mbts.ui {
@@ -11,6 +11,7 @@ namespace mbts {
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
public static class TickExtensions {
static string _nan_text => TickDisplaySettings.Default.nan_text;
@@ -109,20 +110,20 @@ namespace mbts {
public static string format_without_decimal_part(this TickFactors tick, double value) =>
format(tick, value, double.NaN, false, _nan_text, true);
public static string format<T>(this TickFactors tick, T value) where T : IFloatingPoint<T> =>
public static string format<T>(this TickFactors tick, T value) where T : IFloatingPointIeee754<T> =>
format(tick, value, T.NaN, false, _nan_text);
public static string format<T>(this TickFactors tick, T value, bool show_commas)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
format(tick, value, T.NaN, show_commas, _nan_text);
public static string format<T>(this TickDisplaySettings settings, T value)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
format(settings.tick_factors, value, settings);
public static string format<T>(
this bts.api.domain.TickDisplaySettingsImmutable settings, T value)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
settings.to_tick_display_settings().format(value);
public static string format<T>(this TickFactors tick, T value, TickDisplaySettings settings)
@@ -149,7 +150,7 @@ namespace mbts {
bool show_commas,
string nan_text,
bool show_decimal_part = true)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
tick.format(
value,
TickDisplaySettings.Default.with(
@@ -196,7 +197,7 @@ namespace mbts {
parse(display_settings.tick_factors, text, display_settings);
public static T parse<T>(this TickDisplaySettings display_settings, string text)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
parse<T>(display_settings.tick_factors, text, display_settings);
#nullable disable
@@ -204,7 +205,7 @@ namespace mbts {
parse<double>(tick, text, display_settings);
public static T parse<T>(this TickFactors tick, string text, TickDisplaySettings display_settings)
where T : IFloatingPoint<T> {
where T : IFloatingPointIeee754<T> {
if (display_settings is null) {
return parse(tick, text, T.NaN, _nan_text);
}
@@ -213,7 +214,9 @@ namespace mbts {
return parse(tick, text, display_multiplier, nan_text);
}
public static T parse<T>(this TickFactors tick, string text, T display_multiplier, string nan_text) where T : IFloatingPoint<T> =>
public static T parse<T>(
this TickFactors tick, string text, T display_multiplier, string nan_text)
where T : IFloatingPointIeee754<T> =>
tick?.is_valid() ?? false ?
_parse(tick, text, display_multiplier, nan_text) :
_parse_no_tick(text, display_multiplier, nan_text);
@@ -223,37 +226,37 @@ namespace mbts {
string text,
T display_multiplier,
string nan_text
) where T : IFloatingPoint<T> =>
) where T : IFloatingPointIeee754<T> =>
regional_tick.is_valid() ?
_parse(regional_tick, text, display_multiplier, nan_text) :
_parse_no_tick(text, display_multiplier, nan_text);
public static T tick<T>(this TickFactors tick, T value, int count)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
count < 0 ? tick.tickdown(value, (uint)-count) : tick.tickup(value, (uint)count);
public static T tick<T>(this bts.api.domain.TickFactorsImmutable tick, T value, int count)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
tick.to_tick_factors().tick(value, count);
public static T tick<T>(
this bts.api.domain.TickDisplaySettingsImmutable settings, T value, int count)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
settings.HasTickFactors ?
settings.TickFactors.tick(value, count) :
throw new ArgumentException(
"Can't tick because 'settings.HasTickFactors' is false", nameof(settings));
public static T tickup<T>(this TickFactors tick, T input, uint count = 1)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
tickup(tick, input, count, TickUtils.precision_const<T>());
public static T tickup<T>(this TickFactors tick, T input, uint count, T precision)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
tickup<T, NumericCastOutConverter<T>>(tick, input, count, precision);
public static T tickup<T, TFromUInt32>(this TickFactors tick, T input, uint count, T precision)
where T : IFloatingPoint<T>
where T : IFloatingPointIeee754<T>
where TFromUInt32 : IConverter<uint, T> {
if (!precision.is_real_positive()) {
throw new ArgumentException("Must be a real positive number.", nameof(precision));
@@ -262,7 +265,7 @@ namespace mbts {
return input;
}
var tuf = tick.tick_unit_frac<T>();
var ieeer = T.IEEERemainder(input, tuf);
var ieeer = T.Ieee754Remainder(input, tuf);
input -= ieeer;
if (ieeer < -precision) {
count--;
@@ -271,15 +274,18 @@ namespace mbts {
return _round_tick(tuf, result);
}
public static T tickup<T>(this RegionalTickFactors regional_tick, T input) where T : IFloatingPoint<T> =>
public static T tickup<T>(
this RegionalTickFactors regional_tick, T input) where T : IFloatingPointIeee754<T> =>
regional_tick.tickup(input, 1);
public static T tickup<T>(this RegionalTickFactors regional_tick, T input, uint count) where T : IFloatingPoint<T> =>
public static T tickup<T>(
this RegionalTickFactors regional_tick, T input, uint count)
where T : IFloatingPointIeee754<T> =>
regional_tick.tickup(input, count, TickUtils.precision_const<T>());
public static T tickup<T>(
this RegionalTickFactors regional_tick, T input, uint count, T precision)
where T : IFloatingPoint<T> {
where T : IFloatingPointIeee754<T> {
if (!precision.is_real_positive()) {
throw new ArgumentException("Must be a real positive number.", nameof(precision));
}
@@ -292,7 +298,7 @@ namespace mbts {
T ltie = regional_tick.low_tick_inclusive_end.as_type<double, T>();
if (input < ltie) {
tuf = regional_tick.low_tick.tick_unit_frac<T>();
var ieeer = T.IEEERemainder(input, tuf);
var ieeer = T.Ieee754Remainder(input, tuf);
input -= ieeer;
if (ieeer < -precision) count--;
val = input + tuf * count.as_type<uint, T>();
@@ -303,7 +309,7 @@ namespace mbts {
}
} else {
tuf = regional_tick.high_tick.tick_unit_frac<T>();
var ieeer = T.IEEERemainder(input, tuf);
var ieeer = T.Ieee754Remainder(input, tuf);
input -= ieeer;
if (ieeer < -precision) count--;
val = input + tuf * count.as_type<uint, T>();
@@ -312,21 +318,21 @@ namespace mbts {
}
public static T tickdown<T>(this TickFactors tick, T input, uint count = 1)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
tickdown(tick, input, count, TickUtils.precision_const<T>());
public static T tickdown<T>(this TickFactors tick, T input, uint count, T precision)
where T : IFloatingPoint<T> =>
where T : IFloatingPointIeee754<T> =>
tickdown<T, NumericCastOutConverter<T>>(tick, input, count, precision);
public static T tickdown<T, TFromUInt32>(this TickFactors tick, T input, uint count, T precision)
where T : IFloatingPoint<T>
where T : IFloatingPointIeee754<T>
where TFromUInt32 : IConverter<uint, T> {
if (!input.is_real()) {
return input;
}
var tuf = tick.tick_unit_frac<T>();
var ieeer = T.IEEERemainder(input, tuf);
var ieeer = T.Ieee754Remainder(input, tuf);
input -= ieeer;
if (ieeer > precision) {
count--;
@@ -336,21 +342,22 @@ namespace mbts {
}
public static T tickdown<T>(this RegionalTickFactors regional_tick, T input)
where T : IFloatingPoint<T>, IComparisonOperators<T, double> =>
where T : IFloatingPointIeee754<T> =>
regional_tick.tickdown(input, 1);
public static T tickdown<T>(this RegionalTickFactors regional_tick, T input, uint count)
where T : IFloatingPoint<T>, IComparisonOperators<T, double> =>
where T : IFloatingPointIeee754<T> =>
tickdown(regional_tick, input, count, TickUtils.precision_const<T>());
public static T tickdown<T>(
this RegionalTickFactors regional_tick, T input, uint count, T precision) where T : IFloatingPoint<T> =>
this RegionalTickFactors regional_tick, T input, uint count, T precision)
where T : IFloatingPointIeee754<T> =>
tickdown<T, NumericCastOutConverter<T>, NumericCastOutConverter<T>, NumericCastInConverter<T>>(
regional_tick, input, count, precision);
public static T tickdown<T, TFromUInt32, TFromDouble, TToUInt16>(
this RegionalTickFactors regional_tick, T input, uint count, T precision)
where T : IFloatingPoint<T>
where T : IFloatingPointIeee754<T>
where TFromDouble : IConverter<double, T>
where TFromUInt32 : IConverter<uint, T>
where TToUInt16 : IConverter<T, uint> {
@@ -365,7 +372,7 @@ namespace mbts {
T low_tick_inclusive_end = TFromDouble.convert(regional_tick.low_tick_inclusive_end);
if (input > low_tick_inclusive_end) {
tuf = regional_tick.high_tick.tick_unit_frac<T>();
var ieeer = T.IEEERemainder(input, tuf);
var ieeer = T.Ieee754Remainder(input, tuf);
input -= ieeer;
if (ieeer > precision) count--;
val = input - tuf * TFromDouble.convert(count);
@@ -377,7 +384,7 @@ namespace mbts {
}
} else {
tuf = regional_tick.low_tick.tick_unit_frac<T>();
var ieeer = T.IEEERemainder(input, tuf);
var ieeer = T.Ieee754Remainder(input, tuf);
input -= ieeer;
if (ieeer > precision) count--;
val = input - tuf * TFromDouble.convert(count);
@@ -483,7 +490,7 @@ namespace mbts {
return display_digits(tick.tick_base);
}
public static int display_digits<T>(T tick_base) where T : IFloatingPoint<T> {
public static int display_digits<T>(T tick_base) where T : IFloatingPoint<T>, ILogarithmicFunctions<T> {
var log_tick_base = T.Log10(tick_base);
var floor = T.Floor(log_tick_base);
var dec = log_tick_base - floor;
@@ -500,14 +507,14 @@ namespace mbts {
}
static string _format_no_tick<T>(T value, T display_multiplier, bool show_commas)
where T : IFloatingPoint<T> {
where T : INumberBase<T> {
if (!display_multiplier.is_nan()) {
value *= display_multiplier;
}
return value.ToString(show_commas ? "#,0" : "0", null);
}
static T _parse_no_tick<T>(string text, T display_multiplier, string nan_text) where T : IFloatingPoint<T> {
static T _parse_no_tick<T>(string text, T display_multiplier, string nan_text) where T : IFloatingPointIeee754<T> {
if (text == nan_text) {
return T.NaN;
}
@@ -515,7 +522,7 @@ namespace mbts {
result.safe_divide(display_multiplier) : T.NaN;
}
static T _get_integer_part<T>(string integer_text) where T : IFloatingPoint<T> {
static T _get_integer_part<T>(string integer_text) where T : IFloatingPointIeee754<T> {
if (integer_text.is_null_or_white_space()) {
return T.Zero;
}
@@ -524,7 +531,7 @@ namespace mbts {
result : T.NaN;
}
static T _get_numerator_part<T>(string numerator_text, T tick_base) where T : IFloatingPoint<T> {
static T _get_numerator_part<T>(string numerator_text, T tick_base) where T : IFloatingPointIeee754<T> {
if (string.IsNullOrEmpty(numerator_text)) {
return T.Zero;
}
@@ -554,7 +561,7 @@ namespace mbts {
static T _parse<T>(
RegionalTickFactors regional_tick, string text, T display_multiplier, string nan_text)
where T : IFloatingPoint<T> {
where T : IFloatingPointIeee754<T> {
T result = _parse(regional_tick.low_tick, text, display_multiplier, nan_text);
T ltie = regional_tick.low_tick_inclusive_end.as_type<double, T>()
@@ -566,7 +573,7 @@ namespace mbts {
}
static T _parse<T>(TickFactors tick, string text, T display_multiplier, string nan_text)
where T : IFloatingPoint<T> {
where T : IFloatingPointIeee754<T> {
if (text.is_null_or_white_space() || text == nan_text) {
return T.NaN;
}
@@ -584,7 +591,7 @@ namespace mbts {
}
static T _parse<T>(TickFactors tick, T integer_part, string numerator_part_text)
where T : IFloatingPoint<T> {
where T : IFloatingPointIeee754<T> {
T tick_base = tick.tick_base.as_type<double, T>();
T numerator_part = _get_numerator_part(numerator_part_text, tick_base);
return integer_part + numerator_part / tick_base;
@@ -657,7 +664,7 @@ namespace mbts {
}
}
static T _round_tick<T>(T tick_unit_frac, T input) where T : IFloatingPoint<T> =>
input - T.IEEERemainder(input, tick_unit_frac);
static T _round_tick<T>(T tick_unit_frac, T input) where T : IFloatingPointIeee754<T> =>
input - T.Ieee754Remainder(input, tick_unit_frac);
}
}
@@ -9,6 +9,7 @@ using Spark.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
namespace mbts.spark {
static class TickUtils {
+2 -2
View File
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Authors>Blue Trading Systems</Authors>
<Company>Blue Trading Systems</Company>
<Description />
@@ -11,6 +11,7 @@
<PlatformTarget>x64</PlatformTarget>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsAsErrors />
<NoWarn>8981</NoWarn>
<Version>$(major).$(minor).$(patch)</Version>
<Version Condition="'$(version)'=='..'">0.0.0</Version>
</PropertyGroup>
@@ -20,7 +21,6 @@
<PackageReference Include="Google.Protobuf" Version="3.21.4" />
<PackageReference Include="System.Collections.Immutable" Version="5.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Runtime.Experimental" Version="6.0.2" />
</ItemGroup>
<ItemGroup>
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget>
@@ -61,9 +61,6 @@ namespace System.Collections.Generic {
public static IDictionary<TKey, TValue> as_idictionary<TKey, TValue>(this Dictionary<TKey, TValue> dictionary) =>
dictionary;
public static IReadOnlyDictionary<TKey, TValue> AsReadOnly<TKey, TValue>(this IDictionary<TKey, TValue> dictionary) =>
new ReadOnlyDictionary<TKey, TValue>(dictionary);
public static void Difference<TKey, TValue>(this IDictionary<TKey, TValue> left,
IDictionary<TKey, TValue> right,
out IEnumerable<KeyValuePair<TKey, TValue>> exclusive_left,
@@ -13,6 +13,7 @@ namespace System.Collections.Generic {
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Numerics;
using System.Reactive.Linq;
using System.Runtime.Versioning;
+1 -2
View File
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget>
@@ -15,7 +15,6 @@
<PackageReference Include="Google.Protobuf" Version="3.21.4" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="protobuf-net" Version="3.1.17" />
<PackageReference Include="System.Runtime.Experimental" Version="6.0.2" />
</ItemGroup>
<ItemGroup>
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Numerics;
namespace mbts.utils {
static class ExceptionAssert {
+7 -6
View File
@@ -5,6 +5,7 @@ namespace bts.utils {
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Numerics;
public static class MathUtils {
public const double EPSILON = 1E-12;
@@ -14,7 +15,7 @@ namespace bts.utils {
public static readonly IComparer<double> epsilon_comparer = new ErrorMarginComparer<double>(EPSILON);
public static T abs_diff<T>(T x, T y)
where T : ISubtractionOperators<T, T, T>, IComparisonOperators<T, T> =>
where T : ISubtractionOperators<T, T, T>, IComparisonOperators<T, T, bool> =>
x > y ? (x - y) : (y - x);
public static IComparer<double> error_margin_comparer(double error_margin) =>
@@ -36,14 +37,14 @@ namespace bts.utils {
epsilon_equals(x, y, NormalNumericOps<T>.epsilon);
public static bool epsilon_equals<T>(T x, T y, T epsilon)
where T : ISubtractionOperators<T, T, T>, IComparisonOperators<T, T> =>
where T : ISubtractionOperators<T, T, T>, IComparisonOperators<T, T, bool> =>
abs_diff(x, y) < epsilon;
public static bool marginal_equals(double x, double y) =>
marginal_equals(x, y, EPSILON);
public static bool marginal_equals<T>(T x, T y, T margin)
where T : ISubtractionOperators<T, T, T>, IComparisonOperators<T, T> =>
where T : ISubtractionOperators<T, T, T>, IComparisonOperators<T, T, bool> =>
(x > y ? (x - y) : (y - x)) < margin;
public static bool is_nan<T>(T value) where T : INumber<T> =>
@@ -132,7 +133,7 @@ namespace bts.utils {
public static T nan_diff<T>(T a, T b) where T : IFloatingPoint<T> =>
T.IsNaN(a) ? -b : T.IsNaN(b) ? a : a - b;
public static bool is_within_range<T>(T value, T min, T max) where T : IComparisonOperators<T, T> =>
public static bool is_within_range<T>(T value, T min, T max) where T : IComparisonOperators<T, T, bool> =>
value >= min && value <= max;
public static T weighted_average<T>(T x, T x_weight, T y, T y_weight) where T : IFloatingPoint<T> {
@@ -145,7 +146,7 @@ namespace bts.utils {
return x + (y - x) * (x_weight / (x_weight + y_weight));
}
public static T within_range<T>(T value, T min, T max) where T : IComparisonOperators<T, T> {
public static T within_range<T>(T value, T min, T max) where T : IComparisonOperators<T, T, bool> {
if (value < min) {
return min;
}
@@ -156,7 +157,7 @@ namespace bts.utils {
}
public static T within_range<T>(
T value, T? min = null, T? max = null) where T : struct, IComparisonOperators<T, T> {
T value, T? min = null, T? max = null) where T : struct, IComparisonOperators<T, T, bool> {
if (min.HasValue && value < min.Value) {
return min.Value;
}
@@ -2,6 +2,7 @@ namespace Spark.Core {
using bts;
using System;
using System.Numerics;
public class NumericCastConverter :
IConverter<int, int>,
@@ -213,7 +214,7 @@ namespace Spark.Core {
IConverter<T, double>,
IConverter<T, float>,
IConverter<T, decimal>
where T : INumber<T> {
where T : INumberBase<T> {
static readonly Func<T, short> _to_int16;
static readonly Func<T, ushort> _to_uint16;
@@ -342,7 +343,9 @@ namespace Spark.Core {
static decimal IConverter<T, decimal>.convert(T value) => _to_decimal(value);
}
public class NumericCastConverter<TIn, TOut> : IConverter<TIn, TOut> where TIn : INumber<TIn> where TOut : INumber<TOut> {
public class NumericCastConverter<TIn, TOut> : IConverter<TIn, TOut>
where TIn : INumberBase<TIn>
where TOut : INumberBase<TOut> {
static readonly Func<TIn, TOut> _convert;
static NumericCastConverter() {
@@ -3,44 +3,45 @@ namespace bts.utils {
using System;
using System.Collections.Generic;
using System.Numerics;
public static class NumericExtensions {
public static TOut as_type<TOut>(this short value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this short value) where TOut : INumberBase<TOut> =>
as_type<short, TOut>(value);
public static TOut as_type<TOut>(this ushort value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this ushort value) where TOut : INumberBase<TOut> =>
as_type<ushort, TOut>(value);
public static TOut as_type<TOut>(this int value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this int value) where TOut : INumberBase<TOut> =>
as_type<int, TOut>(value);
public static TOut as_type<TOut>(this uint value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this uint value) where TOut : INumberBase<TOut> =>
as_type<uint, TOut>(value);
public static TOut as_type<TOut>(this long value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this long value) where TOut : INumberBase<TOut> =>
as_type<long, TOut>(value);
public static TOut as_type<TOut>(this ulong value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this ulong value) where TOut : INumberBase<TOut> =>
as_type<ulong, TOut>(value);
public static TOut as_type<TOut>(this float value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this float value) where TOut : INumberBase<TOut> =>
as_type<float, TOut>(value);
public static TOut as_type<TOut>(this double value) where TOut : INumber<TOut> =>
public static TOut as_type<TOut>(this double value) where TOut : INumberBase<TOut> =>
as_type<double, TOut>(value);
public static TOut as_type<TIn, TOut>(this TIn value)
where TIn : INumber<TIn>
where TOut : INumber<TOut> =>
where TIn : INumberBase<TIn>
where TOut : INumberBase<TOut> =>
NumericCastConverter<TIn, TOut>.convert(value);
public static T abs<T>(this T value) where T : INumber<T> =>
public static T abs<T>(this T value) where T : INumberBase<T> =>
T.Abs(value);
public static bool is_nan<T>(this T value) where T : IFloatingPoint<T> =>
public static bool is_nan<T>(this T value) where T : INumberBase<T> =>
T.IsNaN(value);
public static T if_nan<T>(this T d, T if_nan) where T : IFloatingPoint<T> =>
public static T if_nan<T>(this T d, T if_nan) where T : INumberBase<T> =>
d.is_nan() ? if_nan : d;
public static bool is_int<T>(this T value) where T : IFloatingPoint<T> =>
@@ -71,15 +72,15 @@ namespace bts.utils {
MathUtils.marginal_equals(x, y, margin);
public static bool is_within_range<T>(
this T value, T min, T max) where T : IComparisonOperators<T, T> =>
this T value, T min, T max) where T : IComparisonOperators<T, T, bool> =>
MathUtils.is_within_range(value, min, max);
public static T within_range<T>(
this T value, T min, T max) where T : IComparisonOperators<T, T> =>
this T value, T min, T max) where T : IComparisonOperators<T, T, bool> =>
MathUtils.within_range(value, min, max);
public static T within_range<T>(
this T value, T? min = null, T? max = null) where T : struct, IComparisonOperators<T, T> =>
this T value, T? min = null, T? max = null) where T : struct, IComparisonOperators<T, T, bool> =>
MathUtils.within_range(value, min, max);
public static bool is_real<T>(this T value) where T : IFloatingPoint<T> =>
@@ -118,7 +119,7 @@ namespace bts.utils {
/// If only <paramref name="b"/> is real, returns <paramref name="b"/>.
/// If neither term is real, returns NaN.
/// </remarks>
public static T add_real<T>(this T a, T b) where T : IFloatingPoint<T> =>
public static T add_real<T>(this T a, T b) where T : IFloatingPointIeee754<T> =>
new[] { a, b }.sum_real(true);
/// <summary>
@@ -129,7 +130,7 @@ namespace bts.utils {
/// If only <paramref name="b"/> is real, returns -<paramref name="b"/>
/// If neither term is real, returns NaN.
/// </remarks>
public static T subtract_real<T>(this T a, T b) where T : IFloatingPoint<T> =>
public static T subtract_real<T>(this T a, T b) where T : IFloatingPointIeee754<T> =>
new[] { a, -b }.sum_real(true);
/// <summary>
@@ -187,7 +188,7 @@ namespace bts.utils {
/// contains no real numbers
/// </param>
public static T sum_real<T>(this IEnumerable<T> values, bool nan_if_none = false)
where T : IFloatingPoint<T> {
where T : IFloatingPointIeee754<T> {
return nan_if_none ? nan_if_none_impl() : normal_impl();
T normal_impl() {
+7 -7
View File
@@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<OutputType>Exe</OutputType>
<GeneratePackageOnBuild Condition="$(Configuration) == 'Release' or $(Configuration) == 'Release'">true</GeneratePackageOnBuild>
<PackageOutputPath>$(OutputPath)\net6.0</PackageOutputPath>
<PackageOutputPath>$(OutputPath)\net7.0</PackageOutputPath>
<IncludeSource>true</IncludeSource>
<IncludeSymbols>true</IncludeSymbols>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
@@ -40,19 +40,19 @@
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences" Condition=" '$(SparkRoot)' != '' ">
<ItemGroup>
<BuildOutputInPackage Include="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
<BuildOutputInPackage Include="$(OutputPath)..\net6.0\libspark.dll" />
<BuildOutputInPackage Include="$(OutputPath)..\net7.0\libspark.dll" />
</ItemGroup>
</Target>
<!-- deployed sdk build net6.0 -->
<ItemGroup Condition=" '$(SparkRoot)' == '' and '$(TargetFramework)' == 'net6.0'">
<!-- deployed sdk build net7.0 -->
<ItemGroup Condition=" '$(SparkRoot)' == '' and '$(TargetFramework)' == 'net7.0'">
<Reference Include="spark_api">
<HintPath>..\..\lib\net6.0\spark_api.dll</HintPath>
<HintPath>..\..\lib\net7.0\spark_api.dll</HintPath>
</Reference>
</ItemGroup>
<Target Name="copy_lib_deployed" AfterTargets="PostBuildEvent" Condition=" '$(SparkRoot)' == '' ">
<Copy SourceFiles="..\..\lib\net6.0\libspark.dll" DestinationFolder="$(OutputPath)\" SkipUnchangedFiles="true" />
<Copy SourceFiles="..\..\lib\net7.0\libspark.dll" DestinationFolder="$(OutputPath)\" SkipUnchangedFiles="true" />
</Target>
</Project>
+1 -1
View File
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget>
+1 -1
View File
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks>
<TargetFrameworks>net7.0</TargetFrameworks>
<RuntimeIdentifiers>win10-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
<Authors>Blue Trading Systems</Authors>
<Company>Blue Trading Systems</Company>
+1 -1
View File
@@ -161,7 +161,7 @@ def to_type_model(field, msg):
elif field.type == types.TYPE_DOUBLE: return TypeModel("double", islist, "double?", jstype='number')
elif field.type == types.TYPE_FLOAT: return TypeModel("float", islist, "float?", jstype='number', fstype='float32')
elif field.type == types.TYPE_STRING: return TypeModel("string", islist, cpptype="std::string")
elif field.type == types.TYPE_BYTES: return TypeModel("ByteString", islist, cpptype="std::string", jstype='Uint8Array', fstype='Fable.Import.JS.Uint8Array')
elif field.type == types.TYPE_BYTES: return TypeModel("ByteString", islist, cpptype="std::string", jstype='Uint8Array', fstype='Fable.Core.JS.Uint8Array')
elif field.type == types.TYPE_BOOL: return TypeModel("bool", islist, "bool?", jstype='boolean', natural_key=True)
elif field.type == types.TYPE_ENUM:
nested_enums = [x.name for x in msg.enum_type]
+2409 -1369
View File
File diff suppressed because it is too large. Load diff
+8 -8
View File
@@ -1,23 +1,23 @@
{
"dependencies": {
"protobufjs": "^6.11.3",
"tslib": "^2.4.0",
"protobufjs": "^7.2.2",
"tslib": "^2.5.0",
"watch": "^1.0.2"
},
"devDependencies": {
"jest": "^28.1.1",
"ts-jest": "^28.0.4",
"jest": "^29.4.3",
"protobufjs-cli": "^1.1.1",
"ts-jest": "^29.0.5",
"ts2fable": "^0.7.1",
"tsutils": "^3.21.0",
"typescript": "^4.7.3",
"ws": "^8.7.0"
"typescript": "^4.9.5",
"ws": "^8.12.1"
},
"scripts": {
"build": "tsc -p tsconfig.release.json",
"watch": "tsc -w -p tsconfig.release.json",
"protogen": "pbjs -t json-module -w commonjs -o %build%/proto.js ../../lib/api/*.proto ../../lib/api/services/*.proto ../../lib/domain_model/*.proto ../../lib/sparkproto/*.proto ../../lib/md/protos/*.proto",
"test": "jest",
"test:watch": "jest --watch",
"fable": "ts2fable %build%/ServiceContext.d.ts %build%/ServiceContext.fs && ts2fable %build%/HelloService.d.ts %build%/HelloService.fs"
"test:watch": "jest --watch"
}
}
+2833 -3529
View File
File diff suppressed because it is too large. Load diff
+18 -21
View File
@@ -8,37 +8,34 @@
"author": "",
"license": "ISC",
"dependencies": {
"@babel/plugin-transform-runtime": "^7.18.2",
"@babel/preset-env": "^7.18.2",
"@babel/runtime": "^7.18.3",
"babel-loader": "^8.2.5",
"fable-loader": "^2.1.9",
"@babel/plugin-transform-runtime": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@babel/runtime": "^7.21.0",
"babel-loader": "^9.1.2",
"fable-utils": "^1.2.0",
"node-sass": "^7.0.1",
"protobufjs": "^6.11.3",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"node-sass": "^8.0.0",
"protobufjs": "^7.2.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"remotedev": "^0.2.9",
"ts2fable": "^0.7.1",
"webpack": "^5.73.0"
"webpack": "^5.75.0"
},
"devDependencies": {
"@babel/core": "^7.18.2",
"@babel/core": "^7.21.0",
"@fortawesome/fontawesome-free": "^5.15.4",
"bulma": "^0.9.4",
"copy-webpack-plugin": "^11.0.0",
"core-js": "^3.22.8",
"css-loader": "^6.7.1",
"fable-compiler": "^2.13.0",
"file-loader": "^6.2.0",
"core-js": "^3.28.0",
"css-loader": "^6.7.3",
"html-webpack-plugin": "^5.5.0",
"mini-css-extract-plugin": "^2.6.0",
"mini-css-extract-plugin": "^2.7.2",
"npx": "^10.2.2",
"sass": "^1.52.3",
"sass-loader": "^13.0.0",
"sass": "^1.58.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.1",
"tslib": "^2.4.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.9.2"
"tslib": "^2.5.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
}
}
+2 -2
View File
@@ -170,8 +170,8 @@ let marginSub model dispatch =
let selectSub (tab:Tab option) model =
match tab, model.tab with
| Some PositionManagementTab, _ | None, PositionManagementTab -> Cmd.ofSub (positionSub model)
| Some MarginTab, _ | None, MarginTab -> Cmd.ofMsg GetMarginData //Cmd.ofSub (marginSub model)
| Some PositionManagementTab, _ | None, PositionManagementTab -> Cmd.ofEffect (positionSub model)
| Some MarginTab, _ | None, MarginTab -> Cmd.ofMsg GetMarginData //Cmd.ofEffect (marginSub model)
| _ ->
match model.unsub with
| Some (unsub) -> unsub.Dispose()
+3 -3
View File
@@ -1225,7 +1225,7 @@ let accountSelectionGrid (accountList:BTSAccount list) (currentAccount:BTSAccoun
onClick = None
}
]
div[] [
div [] [
TableControl.createSelectorTable (Some headerRow) rws
]
@@ -1265,7 +1265,7 @@ let menuItem account selectedAccount model dispatch =
]
]
]
else span[][])
else span [] [])
]
let NavRoot (accounts:BTSAccount[]) selectedAccount model dispatch =
@@ -1312,7 +1312,7 @@ let root (model:Model) dispatch =
| "" -> span [] []
| _ -> Modal.showConfirm (fst model.ConfirmModal) (fun () -> (snd model.ConfirmModal) |> dispatch) (fun _ -> OpenConfirmModal ("", Msg.SelectTab model.tab ) |> dispatch)
match model.adminData with
| None -> div[][str "Loading account list..."]
| None -> div [] [str "Loading account list..."]
| Some data ->
div
[ Class "columns is-fullheight"
-4
View File
@@ -7,10 +7,6 @@ open Types
open App.State
open App.Types
open Global
open Fable.Core.JsInterop
open Types
open App.State
open Global
importAll "../sass/main.scss"
+2 -2
View File
@@ -146,8 +146,8 @@ let buttonColumn action header icon misc =
rowIdx = 0;
misc = misc;
}
[ Fable.React.Props.HTMLAttr.Name header
Fable.React.Props.HTMLAttr.Style [ Fable.React.Props.CSSProp.Width 60 ]
[ HTMLAttr.Name header
Style [ Fable.React.Props.CSSProp.Width 60 ]
]
// [ Name header
-1
View File
@@ -6,7 +6,6 @@ open System
open System.Runtime.InteropServices
open Fable.Core
open Fable.Core.JsInterop
open System.Xml
open bts.api.admin
open Global
+5 -5
View File
@@ -119,7 +119,7 @@ let generalTabView (model:Model) (dispatch:Msg->Unit) (readonly: bool)=
Fields.text "Company" model.scratchUser.company [Disabled readonly] (Company >> UpdateField >> dispatch)
Fields.checkbox "Can Login?" "Unchecking this stops the user from logging into Spark" model.scratchUser.isActive [Disabled can_login_disabled] (IsActive >> UpdateField >> dispatch)
Fields.checkbox "Can Create?" "Checking this allows the user to create other users and accounts" model.scratchUser.canCreate [Disabled (readonly || not can_create)] (CanCreate >> UpdateField >> dispatch)
(if (State.isNewUser model.scratchUser) then modal else span[][])
(if (State.isNewUser model.scratchUser) then modal else span [] [])
]
let accountNameLookup (accountsList:BTSAccount list) (id:string) =
@@ -334,7 +334,7 @@ let tabContent (model:Model) (dispatch:Msg->Unit) display_md display_risk =
| Tab.MarketData, true -> MarketDataTabView model dispatch (not display_md)
| Tab.OrderRouting, true -> orderRoutingTabView model dispatch (not display_risk) )
(if (State.userIsSelected model.scratchUser State.defaultScratchUser) then userControls model dispatch else span[][])
(if (State.userIsSelected model.scratchUser State.defaultScratchUser) then userControls model dispatch else span [] [])
]
let usersMenu (usersList:BTSUser list) (currentUser:BTSUser) (dispatch:Msg->Unit) =
@@ -395,7 +395,7 @@ let userSelectionGrid (usersList:BTSUser list) (currentUser:BTSUser) (dispatch:M
onClick = None
}
]
div[][
div [] [
TableControl.createSelectorTable (Some headerRow) rws
]
@@ -444,7 +444,7 @@ let menuItem (user:BTSUser) (selectedUser:BTSUser) model dispatch =
]
]
else
span[][])
span [] [])
]
let NavRoot (usersList:BTSUser list) (currentUser:BTSUser) model (dispatch:Msg->Unit) =
@@ -496,7 +496,7 @@ let root (model:Model) (dispatch:Msg->Unit) =
| "" -> span [] []
| _ -> Modal.showConfirm (fst model.ConfirmModal) (fun () -> (snd model.ConfirmModal) |> dispatch) (fun _ -> OpenConfirmModal ("", Msg.SwitchTab model.currentTab ) |> dispatch)
(match model.adminData with
| None -> div[][str "Loading user list..."]
| None -> div [] [str "Loading user list..."]
| Some data ->
div
[ Class "columns is-fullheight"
@@ -0,0 +1,486 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"ui/1.0.0": {
"dependencies": {
"Elmish": "4.0.1",
"Elmish.Navigation": "1.0.0",
"Fable.Core": "4.0.0-theta-007",
"Fable.Elmish": "4.0.1",
"Fable.Elmish.Browser": "4.0.1",
"Fable.Elmish.Debugger": "4.0.0",
"Fable.Elmish.HMR": "7.0.0",
"Fable.Elmish.React": "4.0.0",
"Fable.Elmish.UrlParser": "1.0.1",
"Fable.Promise": "3.2.0",
"Fable.React": "9.2.0",
"System.Runtime": "4.3.1"
},
"runtime": {
"ui.dll": {}
}
},
"Elmish/4.0.1": {
"runtime": {
"lib/netstandard2.0/Elmish.dll": {
"assemblyVersion": "4.0.1.0",
"fileVersion": "4.0.1.0"
}
}
},
"Elmish.Navigation/1.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Elmish": "4.0.1"
},
"runtime": {
"lib/net5.0/Elmish.Navigation.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"Fable.Browser.Blob/1.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Blob.dll": {
"assemblyVersion": "1.2.0.0",
"fileVersion": "1.2.0.0"
}
}
},
"Fable.Browser.Dom/2.10.1": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Blob": "1.2.0",
"Fable.Browser.Event": "1.5.0",
"Fable.Browser.WebStorage": "1.1.0",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Dom.dll": {
"assemblyVersion": "2.10.1.0",
"fileVersion": "2.10.1.0"
}
}
},
"Fable.Browser.Event/1.5.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Gamepad": "1.1.0",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Event.dll": {
"assemblyVersion": "1.5.0.0",
"fileVersion": "1.5.0.0"
}
}
},
"Fable.Browser.Gamepad/1.1.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Gamepad.dll": {
"assemblyVersion": "1.1.0.0",
"fileVersion": "1.1.0.0"
}
}
},
"Fable.Browser.WebStorage/1.1.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Event": "1.5.0",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.WebStorage.dll": {
"assemblyVersion": "1.1.0.0",
"fileVersion": "1.1.0.0"
}
}
},
"Fable.Core/4.0.0-theta-007": {
"runtime": {
"lib/netstandard2.0/Fable.Core.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.0.0.0"
}
}
},
"Fable.Elmish/4.0.1": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.dll": {
"assemblyVersion": "4.0.1.0",
"fileVersion": "4.0.1.0"
}
}
},
"Fable.Elmish.Browser/4.0.1": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Dom": "2.10.1",
"Fable.Elmish": "4.0.1",
"Fable.Elmish.UrlParser": "1.0.1"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.Browser.dll": {
"assemblyVersion": "4.0.1.0",
"fileVersion": "4.0.1.0"
}
}
},
"Fable.Elmish.Debugger/4.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Elmish": "4.0.1",
"Thoth.Json": "6.0.0"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.Debugger.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.0.0.0"
}
}
},
"Fable.Elmish.HMR/7.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007",
"Fable.Elmish.React": "4.0.0"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.HMR.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.0"
}
}
},
"Fable.Elmish.React/4.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Elmish": "4.0.1",
"Fable.ReactDom.Types": "18.2.0"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.React.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.0.0.0"
}
}
},
"Fable.Elmish.UrlParser/1.0.1": {
"dependencies": {
"FSharp.Core": "6.0.7"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.UrlParser.dll": {
"assemblyVersion": "1.0.1.0",
"fileVersion": "1.0.1.0"
}
}
},
"Fable.Promise/3.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Fable.Promise.dll": {
"assemblyVersion": "3.2.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"Fable.React/9.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.React.Types": "18.3.0",
"Fable.ReactDom.Types": "18.2.0"
},
"runtime": {
"lib/netstandard2.0/Fable.React.dll": {
"assemblyVersion": "9.2.0.0",
"fileVersion": "9.2.0.0"
}
}
},
"Fable.React.Types/18.3.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Dom": "2.10.1",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Fable.React.Types.dll": {
"assemblyVersion": "18.3.0.0",
"fileVersion": "18.3.0.0"
}
}
},
"Fable.ReactDom.Types/18.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.React.Types": "18.3.0"
},
"runtime": {
"lib/netstandard2.0/Fable.ReactDom.Types.dll": {
"assemblyVersion": "18.2.0.0",
"fileVersion": "18.2.0.0"
}
}
},
"FSharp.Core/6.0.7": {
"runtime": {
"lib/netstandard2.1/FSharp.Core.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.722.51308"
}
},
"resources": {
"lib/netstandard2.1/cs/FSharp.Core.resources.dll": {
"locale": "cs"
},
"lib/netstandard2.1/de/FSharp.Core.resources.dll": {
"locale": "de"
},
"lib/netstandard2.1/es/FSharp.Core.resources.dll": {
"locale": "es"
},
"lib/netstandard2.1/fr/FSharp.Core.resources.dll": {
"locale": "fr"
},
"lib/netstandard2.1/it/FSharp.Core.resources.dll": {
"locale": "it"
},
"lib/netstandard2.1/ja/FSharp.Core.resources.dll": {
"locale": "ja"
},
"lib/netstandard2.1/ko/FSharp.Core.resources.dll": {
"locale": "ko"
},
"lib/netstandard2.1/pl/FSharp.Core.resources.dll": {
"locale": "pl"
},
"lib/netstandard2.1/pt-BR/FSharp.Core.resources.dll": {
"locale": "pt-BR"
},
"lib/netstandard2.1/ru/FSharp.Core.resources.dll": {
"locale": "ru"
},
"lib/netstandard2.1/tr/FSharp.Core.resources.dll": {
"locale": "tr"
},
"lib/netstandard2.1/zh-Hans/FSharp.Core.resources.dll": {
"locale": "zh-Hans"
},
"lib/netstandard2.1/zh-Hant/FSharp.Core.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.NETCore.Platforms/1.1.1": {},
"Microsoft.NETCore.Targets/1.1.3": {},
"System.Runtime/4.3.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.1",
"Microsoft.NETCore.Targets": "1.1.3"
}
},
"Thoth.Json/6.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Thoth.Json.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.0.0"
}
}
}
}
},
"libraries": {
"ui/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Elmish/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6AI++9Ula33yMUG9F83iVrZClurQn5cgriwK7aX9FvlhJFXgRB6IYybD+wx26NNhdPOKQIvfBYZYWwRWWWqJmA==",
"path": "elmish/4.0.1",
"hashPath": "elmish.4.0.1.nupkg.sha512"
},
"Elmish.Navigation/1.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0+CYaZzb988Oi02KeXPTUf0HTi1NXgFXTZ5/OROU22GKAohZe519QK3Be+jkbT0hvQq5EEiJJjPfp3FAgpqDaA==",
"path": "elmish.navigation/1.0.0",
"hashPath": "elmish.navigation.1.0.0.nupkg.sha512"
},
"Fable.Browser.Blob/1.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bM4zbtIeycTFFCH7o4WuN28W70dTxNTMZiMvR70XUTYrBnbz7GpS5XxzUy5caDB4l7s2l7wiuVDhh52t7NXxDg==",
"path": "fable.browser.blob/1.2.0",
"hashPath": "fable.browser.blob.1.2.0.nupkg.sha512"
},
"Fable.Browser.Dom/2.10.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-G1Ul9D3suwBPUxEw0hwclZzDxDk/hLkwAZytgAoxHmv4uGth9Zpi9Fz4gm6C8v6W87qvhcM8lrCpg1awPeATyg==",
"path": "fable.browser.dom/2.10.1",
"hashPath": "fable.browser.dom.2.10.1.nupkg.sha512"
},
"Fable.Browser.Event/1.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Bx2AOOASIG1Eq1Pe8869H8baMePte6STmKGccGuOYMT2p6nWVS8G6ZBZb5encQ0tAL2/0vhA4KJOl4bYwUaQqg==",
"path": "fable.browser.event/1.5.0",
"hashPath": "fable.browser.event.1.5.0.nupkg.sha512"
},
"Fable.Browser.Gamepad/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8m/Ae/mrH2Hb2ue435rTPEeVb2FhfWsRJJLpCxMvk+5EUOO2+IIjIkLq4thUfRL98uQVt9V5cQd14h2aBf2XJA==",
"path": "fable.browser.gamepad/1.1.0",
"hashPath": "fable.browser.gamepad.1.1.0.nupkg.sha512"
},
"Fable.Browser.WebStorage/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tGktTk6QHIOeX7JtG5ISem1p9Rc1iYkgcbpIEzHS2YuvpOa9YomUKABU0Lraz4GMjAGxhhNvAXLRry2w89HdVQ==",
"path": "fable.browser.webstorage/1.1.0",
"hashPath": "fable.browser.webstorage.1.1.0.nupkg.sha512"
},
"Fable.Core/4.0.0-theta-007": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9nDQRQfhz6/NjoXLBMqixCjRYvx8jgHAuGjJow4W0vHoFWNauPhTex+psQsw9FRRuQF2AhIwuhHoh9Tb8JoCfw==",
"path": "fable.core/4.0.0-theta-007",
"hashPath": "fable.core.4.0.0-theta-007.nupkg.sha512"
},
"Fable.Elmish/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BtsXTur95XkWmZaXwIoqfUk8puWpiwgJK8YMTg62C/FYxMl8Z6WM4yuGAjQ6rVpKWw5Ha47VfmOL6k/znK3msw==",
"path": "fable.elmish/4.0.1",
"hashPath": "fable.elmish.4.0.1.nupkg.sha512"
},
"Fable.Elmish.Browser/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XqTMh3TzkyuWmKXOoNAHRDjxcnCAiDkUMIZZX6tkxoHPhtruxnOG5zniOm7K/RZD+NGbreKi82pPswcvmjw6/w==",
"path": "fable.elmish.browser/4.0.1",
"hashPath": "fable.elmish.browser.4.0.1.nupkg.sha512"
},
"Fable.Elmish.Debugger/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-a1gABGh8L6kkzGDeVJP6VJtcimfSi/l3Xaa1lzuMlnzb3oXgtfmzXfx1DV/dtDVujIujueCOsA+JmiBh/2HB7A==",
"path": "fable.elmish.debugger/4.0.0",
"hashPath": "fable.elmish.debugger.4.0.0.nupkg.sha512"
},
"Fable.Elmish.HMR/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4A3u0H3wdmF00UBFJGJK6jlRxzEgkYOegDj2bgVzYTD1L17+0mCy9+QqAYJMuOGtA2klrKAHcU43tYdm0o2Fnw==",
"path": "fable.elmish.hmr/7.0.0",
"hashPath": "fable.elmish.hmr.7.0.0.nupkg.sha512"
},
"Fable.Elmish.React/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cMuWet7DhxgN2G1caYLwjLvoMkH1u75U36cUyL07yxNt/dmGp8GD/+RTtL9wpkfeThfeJHHouCkR708mJcMRpA==",
"path": "fable.elmish.react/4.0.0",
"hashPath": "fable.elmish.react.4.0.0.nupkg.sha512"
},
"Fable.Elmish.UrlParser/1.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Jpw1TPR3YsEeLHF0HMoeHKMYzTgjH+gslq8kNa3/d68GIK09eDpASNzA1gu9YLJkRYy5iUXvvvYtHUOKh+mzEw==",
"path": "fable.elmish.urlparser/1.0.1",
"hashPath": "fable.elmish.urlparser.1.0.1.nupkg.sha512"
},
"Fable.Promise/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4A+Iiembrny2h3AE2BIbchfuLmWHNhpkOTvbTtFXHtGzHVMqEVFRXrAfdy83wX2wK5Og3fqRo1y8t/Bqkd7j6g==",
"path": "fable.promise/3.2.0",
"hashPath": "fable.promise.3.2.0.nupkg.sha512"
},
"Fable.React/9.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZMRkZpBy+6ytUHPk0WjRh15kigncmSGLOAbtf12VaSy48mtgqIW4lC/23X/FEvz8tUGwHvBUen2GzUU1G/L+RQ==",
"path": "fable.react/9.2.0",
"hashPath": "fable.react.9.2.0.nupkg.sha512"
},
"Fable.React.Types/18.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/b8WZ3Bdfhqy9r60ZK9JGZaGNjIMb0ogsrvWIg3k7KfCEvJs5X6+7hCybVkyjVoxwzn9wLyYGRbh5wmuHQT/Vg==",
"path": "fable.react.types/18.3.0",
"hashPath": "fable.react.types.18.3.0.nupkg.sha512"
},
"Fable.ReactDom.Types/18.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2WoBjsLiSgrvR68OJXko0iVaqeMbkPM5Bx813A1WlxOSCJ50M9fwnlwG/MUEZtiOIhQmku/YTJY5a8E8r1+j2Q==",
"path": "fable.reactdom.types/18.2.0",
"hashPath": "fable.reactdom.types.18.2.0.nupkg.sha512"
},
"FSharp.Core/6.0.7": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e6wGrq5smV3Yk2fBE/Y0nBG5oFyF59k5Je0a0QDydUpg6liyaafGjD3xvutciKepCP2knspZ/sWViC/F1OyyQQ==",
"path": "fsharp.core/6.0.7",
"hashPath": "fsharp.core.6.0.7.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/1.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ==",
"path": "microsoft.netcore.platforms/1.1.1",
"hashPath": "microsoft.netcore.platforms.1.1.1.nupkg.sha512"
},
"Microsoft.NETCore.Targets/1.1.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==",
"path": "microsoft.netcore.targets/1.1.3",
"hashPath": "microsoft.netcore.targets.1.1.3.nupkg.sha512"
},
"System.Runtime/4.3.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==",
"path": "system.runtime/4.3.1",
"hashPath": "system.runtime.4.3.1.nupkg.sha512"
},
"Thoth.Json/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fJ9nhZezOyRIsaluEIj5ytCSCbnsvA7ZCa1kY7KkWPqyHtc+SDvjthz5edoFxOAHH44iSmxl6zakapjMSRJbbw==",
"path": "thoth.json/6.0.0",
"hashPath": "thoth.json.6.0.0.nupkg.sha512"
}
}
}
+16 -10
View File
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Version>1.0.0</Version>
<AssemblyVersion>1.0.0</AssemblyVersion>
</PropertyGroup>
@@ -17,6 +17,10 @@
</Otherwise>
</Choose>
<ItemGroup>
<!-- Global to the app -->
<Compile Include="Lens.fs" />
<Compile Include="Cmd.fs" />
<Compile Include="$(API)/ServiceContext.fs" />
<Compile Include="$(API)/DynamicService.fs" />
<Compile Include="Imports.fs" />
@@ -37,9 +41,7 @@
<Compile Include="$(API)/fable/co2.fable.fs" />
<Compile Include="$(API)/fable/MarketDataRelay.fable.fs" />
<!-- Global to the app -->
<Compile Include="Lens.fs" />
<Compile Include="Global.fs" />
<Compile Include="Cmd.fs" />
<Compile Include="Controls/nbsp.fs" />
<Compile Include="Controls/Button.fs" />
<Compile Include="Controls/ReactGrid.fs" />
@@ -68,13 +70,17 @@
<Compile Include="App.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Elmish" Version="4.0.1" />
<PackageReference Include="Elmish.Navigation" Version="1.0.0" />
<PackageReference Include="Fable.Core" Version="4.0.0-snake-island-alpha-005" />
<PackageReference Include="Fable.Elmish" Version="4.0.0-beta-3" />
<PackageReference Include="Fable.Elmish.React" Version="4.0.0-beta-2" />
<PackageReference Include="Fable.Elmish.UrlParser" Version="1.0.0-beta-1" />
<PackageReference Include="Fable.Elmish.Debugger" Version="4.0.0-beta-1" />
<PackageReference Include="Fable.Elmish.HMR" Version="6.0.0-beta-002" />
<PackageReference Include="Fable.Fetch" Version="2.4.0" />
<PackageReference Include="Fable.Core" Version="4.0.0-theta-007" />
<PackageReference Include="Fable.Elmish" Version="4.0.1" />
<PackageReference Include="Fable.Elmish.Browser" Version="4.0.1" />
<PackageReference Include="Fable.Elmish.React" Version="4.0.0" />
<PackageReference Include="Fable.Elmish.UrlParser" Version="1.0.1" />
<PackageReference Include="Fable.Elmish.Debugger" Version="4.0.0" />
<PackageReference Include="Fable.Elmish.HMR" Version="7.0.0" />
<PackageReference Include="Fable.Promise" Version="3.2.0" />
<PackageReference Include="Fable.React" Version="9.2.0" />
<PackageReference Include="System.Runtime" Version="4.3.1" />
</ItemGroup>
</Project>
+1 -11
View File
@@ -33,7 +33,7 @@ module.exports = env => {
ignored: "./**/*"
},
devtool: isProduction ? undefined : "source-map",
entry: resolve('src/ui.fsproj'),
entry: resolve(`${output_path}/App.js`),
output: {
filename: 'bundle.js',
path: output_path,
@@ -58,16 +58,6 @@ module.exports = env => {
},
module: {
rules: [
{
test: /\.fs(x|proj)?$/,
use: {
loader: "fable-loader",
options: {
babel: babelOptions,
define: isProduction ? [] : ["DEBUG"]
}
}
},
{
test: /\.js$/,
exclude: /node_modules/,
-16
View File
@@ -1,16 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2015
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "ui", "web/ui/src/ui.fsproj", "{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
+8 -8
View File
@@ -2,44 +2,44 @@
<PropertyGroup>
<BuildRoot>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)))</BuildRoot>
<Net60OutputPath>$(BuildRoot)\$(Configuration)\bin\net6.0\</Net60OutputPath>
<Net60WinOutputPath>$(BuildRoot)\$(Configuration)\bin\net6.0-windows\</Net60WinOutputPath>
<Net70OutputPath>$(BuildRoot)\$(Configuration)\bin\net7.0\</Net70OutputPath>
<Net70WinOutputPath>$(BuildRoot)\$(Configuration)\bin\net7.0-windows\</Net70WinOutputPath>
<ErrorReport>None</ErrorReport>
</PropertyGroup>
<Target
Name="CopyToNet60"
Name="CopyToNet70"
AfterTargets="Link">
<Copy
SourceFiles="$(OutDir)libspark.dll"
Condition="Exists('$(OutDir)libspark.dll')"
DestinationFolder="$(Net60OutputPath)"
DestinationFolder="$(Net70OutputPath)"
Retries="512"
RetryDelayMilliseconds="250"
SkipUnchangedFiles="true" />
<Copy
SourceFiles="$(OutDir)libspark.pdb"
Condition="Exists('$(OutDir)libspark.pdb')"
DestinationFolder="$(Net60OutputPath)"
DestinationFolder="$(Net70OutputPath)"
Retries="512"
RetryDelayMilliseconds="250"
SkipUnchangedFiles="true" />
</Target>
<Target
Name="CopyToNet60Win"
Name="CopyToNet70Win"
AfterTargets="Link">
<Copy
SourceFiles="$(OutDir)libspark.dll"
Condition="Exists('$(OutDir)libspark.dll')"
DestinationFolder="$(Net60WinOutputPath)"
DestinationFolder="$(Net70WinOutputPath)"
Retries="512"
RetryDelayMilliseconds="250"
SkipUnchangedFiles="true" />
<Copy
SourceFiles="$(OutDir)libspark.pdb"
Condition="Exists('$(OutDir)libspark.pdb')"
DestinationFolder="$(Net60WinOutputPath)"
DestinationFolder="$(Net70WinOutputPath)"
Retries="512"
RetryDelayMilliseconds="250"
SkipUnchangedFiles="true" />
+6 -3
View File
@@ -307,10 +307,13 @@ def build(
bins = SparkPaths.client_bins(build_dir, configuration=configuration)
for t in publish_tgts:
build_cmd_steps.append(f'cd {Path(t.path).parent}')
build_cmd_steps.append('dotnet publish -c Release -r win-x64 --sc')
build_cmd_steps.append(f'cmake --build {build_dir} --config {configuration}')
build_cmd_steps.append(f'dotnet publish -c Release -r win-x64 --sc {t.path}')
libspark_path=build_dir.joinpath("src", "lib", configuration, "libspark.dll")
print(f'libspark-src: {libspark_path}')
print(f'libspark-dst: {bins.joinpath("win-x64", "publish")}')
build_cmd_steps.append(
f'copy {bins.joinpath("libspark.dll")} {bins.joinpath("publish")}')
f'copy {libspark_path} {bins.joinpath("win-x64", "publish")}')
build_cmd = ' && '.join(build_cmd_steps)
proc_results.append(subprocess.run(build_cmd))
+8
View File
@@ -154,6 +154,14 @@ def _fable_webpack(src_path, ui_out_path):
copytree(str(src_path.joinpath('ui', 'public')), str(ui_out_path))
os.chdir(src_path.joinpath('ui', 'src'))
_wrapped_run('dotnet restore')
_wrapped_run('dotnet tool restore')
# Note: We used to convert fs -> js via webpack, using the node pkgs
# fable-compiler & fable-loader. However, as of 02/24/2023, they are
# incompatible w/ net7.0. Fortunately the dotnet tool 'fable' IS
# compatible w/ net7.0.
_wrapped_run(f'dotnet fable -o {ui_out_path}')
# Run webpack via 'npm run build'
# (the build cmd is defined in package.json)
_wrapped_run('npm run build')
+1 -1
View File
@@ -42,7 +42,7 @@ class SparkPaths:
@staticmethod
def client_bins(build_root=_default_build(), configuration='Release'):
return build_root.joinpath(configuration, 'bin', 'net6.0-windows', 'win-x64')
return build_root.joinpath(configuration, 'bin', 'net7.0-windows')
@staticmethod
def client_sln():
+1 -1
View File
@@ -38,7 +38,7 @@ def _main():
output_dir = args.output_dir or SparkPaths.default_build()
output_dir = Path(output_dir)
build(
configuration='release',
configuration='Release',
restore=True,
build_dir=output_dir,
targets=['publish'],