diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d314c44e..13ede6c4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,24 +61,19 @@ jobs: 7.0.x 8.0.x - - name: Publish Tools + - name: Publish run: | - platforms="win-x64 linux-x64 osx-x64 osx-arm64" - echo "$platforms" | tr ' ' '\n' | while read -r platform; do - ./publish.sh DxFeed.Graal.Net.Tools net8.0 "$platform" - done - - (cd artifacts/Publish/DxFeed.Graal.Net.Tools && for dir in */; do - (cd "$dir" && zip "../DxFeed.Graal.Net.Tools-${dir%/}-${{ github.ref_name }}.zip" . -r -D) - done) + dotnet tool install -g dotnet-script + dotnet script publish.csx shell: bash - - name: Upload Tools + - name: Upload uses: softprops/action-gh-release@v1 with: generate_release_notes: true files: | artifacts/Publish/DxFeed.Graal.Net.Tools/*.zip + artifacts/Publish/Samples/*.zip token: ${{ secrets.GITHUB_TOKEN }} - name: Pack NuGet @@ -135,20 +130,3 @@ jobs: tag_name: ${{ steps.prepare_tag.outputs.DEPLOY_TAG_NAME }} commit_message: 'deploy: ${{ github.ref_name }}' allow_empty_commit: true - -# ToDo Create a reusable workflow and extract uploading artifacts to a separate flow. -# - name: Upload DxFeed.Graal.Net.Tools -# if: github.event_name == 'workflow_dispatch' -# uses: actions/upload-artifact@v3 -# with: -# name: DxFeed.Graal.Net.Tools-self-contained-${{ matrix.OS_NAME }} -# path: | -# artifacts/Publish/${{ matrix.OS_NAME }}/ -# -# - name: Upload DxFeed.Graal.Net.Tools for macOS Apple Silicon -# if: github.event_name == 'workflow_dispatch' && matrix.os == 'macOS-latest' -# uses: actions/upload-artifact@v3 -# with: -# name: DxFeed.Graal.Net.Tools-self-contained-osx-arm64 -# path: | -# artifacts/Publish/osx-arm64 diff --git a/NuGet.Config b/NuGet.Config index f3fb6689..872707e2 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,7 @@ + diff --git a/README.md b/README.md index 3f3048d3..b5cf8a6f 100644 --- a/README.md +++ b/README.md @@ -77,16 +77,16 @@ ready to answer any questions and help with the transition. #### Sample Mapping -| # | Sample | Old Version | New Version | -|:-:|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------| -| 1 | How to get Instrument Profiles | [dxf_ipf_connect_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_ipf_connect_sample) | [DxFeedIpfConnect](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedIpfConnect) | -| 2 | How to get live updates for Instrument Profiles | [dxf_instrument_profile_live_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_instrument_profile_live_sample) | [DxFeedLiveIpfSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedLiveIpfSample) | -| 3 | How to subscribe to `Order`, `SpreadOrder`, `Candle`, `TimeAndSale`, `Greeks`, `Series` snapshots | [dxf_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_snapshot_sample) | *Q4’2024*, please see [TBD](#future-development) section | -| 4 | How to subscribe to depth of market | [dxf_price_level_book_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_price_level_book_sample) | [PriceLevelBookSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/PriceLevelBookSample) | -| 5 | How to receive snapshots of `TimeAndSale`, `Candle`, `Series`, `Greeks` events on a given time interval without live subscription | [dxf_simple_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_simple_data_retrieving_sample) | [FetchDailyCandles](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/FetchDailyCandles) | -| 6 | How to subscribe to order snapshot with incremental updates | [dxf_inc_order_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_inc_order_snapshot_sample) | [IncOrderSnapshotSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/IncOrderSnapshotSample) | -| 7 | How to retrieve `Candle` data from the candle web service | [dxf_candle_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_candle_data_retrieving_sample) | [CandleDataResponseReader](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/CandleDataResponseReader) | | -| 8 | How to retrieve `TimeAndSale` data from the candle web service | [dxf_tns_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_tns_data_retrieving_sample) | [CandleDataResponseReader](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/CandleDataResponseReader) | | +| # | Sample | Old Version | New Version | +|:-:|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------| +| 1 | How to get Instrument Profiles | [dxf_ipf_connect_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_ipf_connect_sample) | [IpfSample](samples/IPF/IpfSample) | +| 2 | How to get live updates for Instrument Profiles | [dxf_instrument_profile_live_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_instrument_profile_live_sample) | [IpfLiveSample](samples/IPF/IpfLiveSample) | +| 3 | How to subscribe to `Order`, `SpreadOrder`, `Candle`, `TimeAndSale`, `Greeks`, `Series` snapshots | [dxf_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_snapshot_sample) | *Q4’2024*, please see [TBD](#future-development) section | +| 4 | How to subscribe to depth of market | [dxf_price_level_book_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_price_level_book_sample) | [PriceLevelBookSample](samples/UI/PriceLevelBookSample) | +| 5 | How to receive snapshots of `TimeAndSale`, `Candle`, `Series`, `Greeks` events on a given time interval without live subscription | [dxf_simple_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_simple_data_retrieving_sample) | [FetchDailyCandlesSample](samples/Candle/FetchDailyCandlesSample) | +| 6 | How to subscribe to order snapshot with incremental updates | [dxf_inc_order_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_inc_order_snapshot_sample) | [IncOrderSnapshotSample](samples/Model/IncOrderSnapshotSample) | +| 7 | How to retrieve `Candle` data from the candle web service | [dxf_candle_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_candle_data_retrieving_sample) | [CandleDataSample](samples/Candle/CandleDataSample) | | +| 8 | How to retrieve `TimeAndSale` data from the candle web service | [dxf_tns_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_tns_data_retrieving_sample) | [CandleDataSample](samples/Candle/CandleDataSample) | | ### Implementation Details @@ -410,44 +410,44 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine ## Samples -- [x] [ConvertTapeFile](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/ConvertTapeFile/Program.cs) +- [x] [ConvertTapeFileSample](samples/File/ConvertTapeFileSample) demonstrates how to convert one tape file to another tape file with optional intermediate processing or filtering -- [x] [DxFeedFileParser](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/DxFeedFileParser/Program.cs) +- [x] [FileParserSample](samples/File/FileParserSample) is a simple demonstration of how events are read form a tape file -- [x] [DxFeedSample](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/DxFeedSample/Program.cs) +- [x] [QuoteAndTradeSample](samples/API/QuoteAndTradeSample) is a simple demonstration of how to create multiple event listeners and subscribe to `Quote` and `Trade` events -- [x] [PrintQuoteEvents](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/PrintQuoteEvents/Program.cs) +- [x] [PrintQuoteEventsSample](samples/API/PrintQuoteEventsSample) is a simple demonstration of how to subscribe to the `Quote` event, using a `DxFeed` instance singleton - and `dxfeed.properties` file -- [x] [WriteTapeFile](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/WriteTapeFile/Program.cs) + and `dxfeed.system.properties` file +- [x] [WriteTapeFileSample](samples/File/WriteTapeFileSample) is a simple demonstration of how to write events to a tape file -- [x] [DxFeedIpfConnect](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedIpfConnect) is a simple +- [x] [IpfSample](samples/IPF/IpfSample) is a simple demonstration of how to get Instrument Profiles -- [x] [DxFeedLiveIpfSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedLiveIpfSample) is a +- [x] [IpfLiveSample](samples/IPF/IpfLiveSample) is a simple demonstration of how to get live updates for Instrument Profiles -- [x] [ScheduleSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/ScheduleSample) is a simple +- [x] [ScheduleSample](samples/Schedule/ScheduleSample) is a simple demonstration of how to get various scheduling information for instruments -- [x] [FetchDailyCandles](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/FetchDailyCandles) +- [x] [FetchDailyCandlesSample](samples/Candle/FetchDailyCandlesSample) is a simple demonstration of how to fetch last N-days of candles for a specified symbol -- [x] [DxFeedReconnectSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedReconnectSample) +- [x] [ReconnectSample](samples/API/ReconnectSample) is a simple demonstration of how to connect to an endpoint, subscribe to market data events, handle reconnections and re-subscribing. -- [x] [CandleDataResponseReader](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/CandleDataResponseReader) +- [x] [CandleDataSample](samples/Candle/CandleDataSample) is a simple demonstration of how to parse response from CandleData service. -- [x] [MarketDepthModelSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/MarketDepthModelSample) +- [x] [MarketDepthModelSample](samples/UI/MarketDepthModelSample) is a simple demonstration of how to draw a Market Depth using Avalonia UI. -- [x] [CandleChartSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/CandleChartSample) +- [x] [CandleChartSample](samples/UI/CandleChartSample) is a simple demonstration of how to draw a Candlestick Chart using Avalonia UI. -- [x] [IncOrderSnapshotSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/IncOrderSnapshotSample) +- [x] [IncOrderSnapshotSample](samples/Model/IncOrderSnapshotSample) is a simple demonstration of how to subscribe to the Order event and handle snapshots and updates. -- [x] [MultipleMarketDepthSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/MultipleMarketDepthSample) +- [x] [MultipleMarketDepthSample](samples/Model/MultipleMarketDepthSample) is a simple demonstration of how to use the `MarketDepthModel` to manage and display order books for multiple symbols. -- [x] [DXFeedOptionChain](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DXFeedOptionChain) +- [x] [OptionChainSample](samples/IPF/OptionChainSample) how to build option chains, and prints quotes for nearby option strikes. -- [x] [LastEventConsoleSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/LastEventConsoleSample) +- [x] [LastEventConsoleSample](samples/Console/LastEventConsoleSample) is a simple demonstration how to subscribe to various market events with the dxFeed API, cache them in memory, and take snapshots of these events based on user input. -- [x] [PriceLevelBookSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/PriceLevelBookSample) +- [x] [PriceLevelBookSample](samples/UI/PriceLevelBookSample) is a simple demonstration of how to represent a price level book (market by price) that aggregates individual orders (market by order). @@ -559,8 +559,6 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine - [x] [GetLastEvent](https://docs.dxfeed.com/dxfeed/api/com/dxfeed/api/DXFeed.html#getLastEvent-E-) returns the last event for the specified event instance - ([DxFeedSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedSample)) - - [x] [GetTimeSeriesPromise](https://docs.dxfeed.com/dxfeed/api/com/dxfeed/api/DXFeed.html#getTimeSeriesPromise-java.lang.Class-java.lang.Object-long-long-) requests time series events for the specified event type, symbol, and time range @@ -568,7 +566,6 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine - [x] [InstrumentProfile](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.InstrumentProfile.html) represents basic profile information about a market instrument - ([DxFeedIpfConnect](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedIpfConnect)) - [x] [InstrumentProfileReader](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.InstrumentProfileReader.html) reads @@ -576,7 +573,6 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine - [x] [InstrumentProfileCollector](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.Live.InstrumentProfileCollector.html) collects instrument profile updates and provides the live instrument profiles list - ([DxFeedLiveIpfSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedLiveIpfSample)) - [x] [InstrumentProfileConnection](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.Live.InstrumentProfileConnection.html) connects to an instrument profile URL and reads instrument profiles with support of streaming live updates @@ -584,4 +580,3 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine - [x] [Schedule](https://docs.dxfeed.com/dxfeed/api/com/dxfeed/schedule/Schedule.html) provides an API to retrieving and exploring the trading schedules of various exchanges and different financial instrument classes - ([ScheduleSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/ScheduleSample)) diff --git a/dxfeed-graal-net-api.sln b/dxfeed-graal-net-api.sln index 6b6e004e..6b41668b 100644 --- a/dxfeed-graal-net-api.sln +++ b/dxfeed-graal-net-api.sln @@ -4,53 +4,71 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeed.Graal.Net", "src\DxF EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeed.Graal.Net.Tools", "src\DxFeed.Graal.Net.Tools\DxFeed.Graal.Net.Tools.csproj", "{1F8765D9-1ED0-40EC-8239-B3E9F7BDF38C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D8A3B3E7-CFFD-4113-862D-B9E9E7FF0BA5}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeed.Graal.Net.Tests", "tests\DxFeed.Graal.Net.Tests\DxFeed.Graal.Net.Tests.csproj", "{7F07BB95-9DB6-4331-BCCF-FBF441F8F3E2}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{C4490D74-2970-4A1B-8178-A724A06B140A}" + ProjectSection(SolutionItems) = preProject + samples\Directory.Build.props = samples\Directory.Build.props + samples\dxfeed.properties = samples\dxfeed.system.properties + EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrintQuoteEvents", "samples\PrintQuoteEvents\PrintQuoteEvents.csproj", "{73597E04-D8A8-4991-A759-7F886CBE2A8F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{BABA2486-F8A5-4608-A79F-D03247FE2332}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedConnect", "samples\DxFeedConnect\DxFeedConnect.csproj", "{2A8B6037-09FF-40DC-868F-A0ED54A46287}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AuthSample", "samples\API\AuthSample\AuthSample.csproj", "{B9088D14-10F6-4D88-876D-062B9F6494AB}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D8A3B3E7-CFFD-4113-862D-B9E9E7FF0BA5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectSample", "samples\API\ConnectSample\ConnectSample.csproj", "{2A8B6037-09FF-40DC-868F-A0ED54A46287}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WriteTapeFile", "samples\WriteTapeFile\WriteTapeFile.csproj", "{F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrintQuoteEventsSample", "samples\API\PrintQuoteEventsSample\PrintQuoteEventsSample.csproj", "{73597E04-D8A8-4991-A759-7F886CBE2A8F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertTapeFile", "samples\ConvertTapeFile\ConvertTapeFile.csproj", "{F9369083-EB43-455F-8944-07246E4FE6AC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuoteAndTradeSample", "samples\API\QuoteAndTradeSample\QuoteAndTradeSample.csproj", "{ECD5E041-0FBF-475E-82A6-DE6384EF25A0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedFileParser", "samples\DxFeedFileParser\DxFeedFileParser.csproj", "{62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReconnectSample", "samples\API\ReconnectSample\ReconnectSample.csproj", "{C457D53F-A033-465C-B250-A6CC60D02F98}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedSample", "samples\DxFeedSample\DxFeedSample.csproj", "{ECD5E041-0FBF-475E-82A6-DE6384EF25A0}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Candle", "Candle", "{F7C44172-08CC-4CF9-97A8-01460C2AB759}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleSample", "samples\CandleSample\CandleSample.csproj", "{CECAB17A-9DBE-4A4E-8556-5747AB170714}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleDataSample", "samples\Candle\CandleDataSample\CandleDataSample.csproj", "{2567935E-FEFB-470A-BF17-7A883735C4BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedIpfConnect", "samples\DxFeedIpfConnect\DxFeedIpfConnect.csproj", "{62206DAF-999F-437A-AC18-1217ED14EB52}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleSample", "samples\Candle\CandleSample\CandleSample.csproj", "{CECAB17A-9DBE-4A4E-8556-5747AB170714}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedLiveIpfSample", "samples\DxFeedLiveIpfSample\DxFeedLiveIpfSample.csproj", "{C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FetchDailyCandlesSample", "samples\Candle\FetchDailyCandlesSample\FetchDailyCandlesSample.csproj", "{0797D7A4-3572-457B-AAD9-3F26098D4BDD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FetchDailyCandles", "samples\FetchDailyCandles\FetchDailyCandles.csproj", "{0797D7A4-3572-457B-AAD9-3F26098D4BDD}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{6E5A386D-1FB6-45BE-A80E-E29CA4AC697E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduleSample", "samples\ScheduleSample\ScheduleSample.csproj", "{119E7BB3-4B97-4824-9CA7-0D4C9B57590D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LastEventConsoleSample", "samples\Console\LastEventConsoleSample\LastEventConsoleSample.csproj", "{0CD0E240-687A-46A7-B343-BA8A6549A216}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedReconnectSample", "samples\DxFeedReconnectSample\DxFeedReconnectSample.csproj", "{C457D53F-A033-465C-B250-A6CC60D02F98}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "File", "File", "{D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAuthSample", "samples\SimpleAuthSample\SimpleAuthSample.csproj", "{B9088D14-10F6-4D88-876D-062B9F6494AB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertTapeFileSample", "samples\File\ConvertTapeFileSample\ConvertTapeFileSample.csproj", "{F9369083-EB43-455F-8944-07246E4FE6AC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleDataResponseReader", "samples\CandleDataResponseReader\CandleDataResponseReader.csproj", "{2567935E-FEFB-470A-BF17-7A883735C4BF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileParserSample", "samples\File\FileParserSample\FileParserSample.csproj", "{62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDepthModelSample", "samples\UI\MarketDepthModelSample\MarketDepthModelSample.csproj", "{930B1039-B76C-42C5-AD0F-9FA1A1FC9D84}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WriteTapeFileSample", "samples\File\WriteTapeFileSample\WriteTapeFileSample.csproj", "{F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleChartSample", "samples\UI\CandleChartSample\CandleChartSample.csproj", "{B74E8A86-1AB7-4B36-AED3-292CDD95BF90}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IPF", "IPF", "{01C0CC82-3B56-434C-B133-4CAA5B3BFE70}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IpfLiveSample", "samples\IPF\IpfLiveSample\IpfLiveSample.csproj", "{C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IpfSample", "samples\IPF\IpfSample\IpfSample.csproj", "{62206DAF-999F-437A-AC18-1217ED14EB52}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IncOrderSnapshotSample", "samples\IncOrderSnapshotSample\IncOrderSnapshotSample.csproj", "{9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OptionChainSample", "samples\IPF\OptionChainSample\OptionChainSample.csproj", "{7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultipleMarketDepthSample", "samples\MultipleMarketDepthSample\MultipleMarketDepthSample.csproj", "{C8F5013F-7F40-46D2-92AD-6B593524A1D0}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Model", "Model", "{2D069CF7-FE52-487B-8AF9-1A7EB0B296FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IncOrderSnapshotSample", "samples\Model\IncOrderSnapshotSample\IncOrderSnapshotSample.csproj", "{9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultipleMarketDepthSample", "samples\Model\MultipleMarketDepthSample\MultipleMarketDepthSample.csproj", "{C8F5013F-7F40-46D2-92AD-6B593524A1D0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Schedule", "Schedule", "{774DD1AE-2931-44CC-8AF2-F28955230507}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduleSample", "samples\Schedule\ScheduleSample\ScheduleSample.csproj", "{119E7BB3-4B97-4824-9CA7-0D4C9B57590D}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DXFeedOptionChain", "samples\DXFeedOptionChain\DXFeedOptionChain.csproj", "{7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleChartSample", "samples\UI\CandleChartSample\CandleChartSample.csproj", "{B74E8A86-1AB7-4B36-AED3-292CDD95BF90}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LastEventConsoleSample", "samples\LastEventConsoleSample\LastEventConsoleSample.csproj", "{0CD0E240-687A-46A7-B343-BA8A6549A216}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDepthModelSample", "samples\UI\MarketDepthModelSample\MarketDepthModelSample.csproj", "{930B1039-B76C-42C5-AD0F-9FA1A1FC9D84}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PriceLevelBookSample", "samples\UI\PriceLevelBookSample\PriceLevelBookSample.csproj", "{A5B1FE68-8943-4340-BFEC-6D1B40823493}" EndProject @@ -158,28 +176,35 @@ Global {A5B1FE68-8943-4340-BFEC-6D1B40823493}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution - {73597E04-D8A8-4991-A759-7F886CBE2A8F} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {2A8B6037-09FF-40DC-868F-A0ED54A46287} = {C4490D74-2970-4A1B-8178-A724A06B140A} {7F07BB95-9DB6-4331-BCCF-FBF441F8F3E2} = {D8A3B3E7-CFFD-4113-862D-B9E9E7FF0BA5} - {F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {F9369083-EB43-455F-8944-07246E4FE6AC} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {ECD5E041-0FBF-475E-82A6-DE6384EF25A0} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {CECAB17A-9DBE-4A4E-8556-5747AB170714} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {62206DAF-999F-437A-AC18-1217ED14EB52} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {0797D7A4-3572-457B-AAD9-3F26098D4BDD} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {119E7BB3-4B97-4824-9CA7-0D4C9B57590D} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {C457D53F-A033-465C-B250-A6CC60D02F98} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {B9088D14-10F6-4D88-876D-062B9F6494AB} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {2567935E-FEFB-470A-BF17-7A883735C4BF} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {C8F5013F-7F40-46D2-92AD-6B593524A1D0} = {C4490D74-2970-4A1B-8178-A724A06B140A} {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC} = {C4490D74-2970-4A1B-8178-A724A06B140A} {B74E8A86-1AB7-4B36-AED3-292CDD95BF90} = {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC} {930B1039-B76C-42C5-AD0F-9FA1A1FC9D84} = {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC} - {7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19} = {C4490D74-2970-4A1B-8178-A724A06B140A} - {0CD0E240-687A-46A7-B343-BA8A6549A216} = {C4490D74-2970-4A1B-8178-A724A06B140A} {A5B1FE68-8943-4340-BFEC-6D1B40823493} = {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC} + {BABA2486-F8A5-4608-A79F-D03247FE2332} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {6E5A386D-1FB6-45BE-A80E-E29CA4AC697E} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {01C0CC82-3B56-434C-B133-4CAA5B3BFE70} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {774DD1AE-2931-44CC-8AF2-F28955230507} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {2A8B6037-09FF-40DC-868F-A0ED54A46287} = {BABA2486-F8A5-4608-A79F-D03247FE2332} + {ECD5E041-0FBF-475E-82A6-DE6384EF25A0} = {BABA2486-F8A5-4608-A79F-D03247FE2332} + {0CD0E240-687A-46A7-B343-BA8A6549A216} = {6E5A386D-1FB6-45BE-A80E-E29CA4AC697E} + {7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19} = {01C0CC82-3B56-434C-B133-4CAA5B3BFE70} + {C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8} = {01C0CC82-3B56-434C-B133-4CAA5B3BFE70} + {62206DAF-999F-437A-AC18-1217ED14EB52} = {01C0CC82-3B56-434C-B133-4CAA5B3BFE70} + {119E7BB3-4B97-4824-9CA7-0D4C9B57590D} = {774DD1AE-2931-44CC-8AF2-F28955230507} + {C457D53F-A033-465C-B250-A6CC60D02F98} = {BABA2486-F8A5-4608-A79F-D03247FE2332} + {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {F7C44172-08CC-4CF9-97A8-01460C2AB759} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {2D069CF7-FE52-487B-8AF9-1A7EB0B296FD} = {C4490D74-2970-4A1B-8178-A724A06B140A} + {F9369083-EB43-455F-8944-07246E4FE6AC} = {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2} + {F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A} = {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2} + {62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9} = {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2} + {9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C} = {2D069CF7-FE52-487B-8AF9-1A7EB0B296FD} + {C8F5013F-7F40-46D2-92AD-6B593524A1D0} = {2D069CF7-FE52-487B-8AF9-1A7EB0B296FD} + {2567935E-FEFB-470A-BF17-7A883735C4BF} = {F7C44172-08CC-4CF9-97A8-01460C2AB759} + {CECAB17A-9DBE-4A4E-8556-5747AB170714} = {F7C44172-08CC-4CF9-97A8-01460C2AB759} + {0797D7A4-3572-457B-AAD9-3F26098D4BDD} = {F7C44172-08CC-4CF9-97A8-01460C2AB759} + {B9088D14-10F6-4D88-876D-062B9F6494AB} = {BABA2486-F8A5-4608-A79F-D03247FE2332} + {73597E04-D8A8-4991-A759-7F886CBE2A8F} = {BABA2486-F8A5-4608-A79F-D03247FE2332} EndGlobalSection EndGlobal diff --git a/publish.cmd b/publish.cmd deleted file mode 100644 index acfab33c..00000000 --- a/publish.cmd +++ /dev/null @@ -1,38 +0,0 @@ -@echo off - -IF "%3"=="" ( - REM Publish .NET app. - dotnet publish^ - src/"%1"/"%1".csproj^ - -p:UseAppHost=false^ - -p:DebugType=None^ - -p:DebugSymbols=false^ - --framework "%2"^ - -c Release^ - -o artifacts/Publish/"%1"/ - exit 0 -) ELSE IF "%4"=="" ( - REM Publish self-contained app for specified platform. - dotnet publish -r "%3"^ - src/"%1"/"%1".csproj^ - -p:PublishSingleFile=true^ - -p:IncludeNativeLibrariesForSelfExtract=true^ - -p:AllowedReferenceRelatedFileExtensions=none^ - -p:DebugType=None^ - --self-contained true^ - --framework "%2"^ - -c Release^ - -o artifacts/Publish/"%3"/"%1"/ - exit 0 -) ELSE ( - REM Print usage. - echo "Usage:" - echo " []" - echo "" - echo "Where:" - echo " project Project name." - echo " framework .NET version (net6.0, net7.0, net8.0)." - echo " platform Platform name (win-x64, linux-x64, osx-x64, osx-arm64)" - echo " for self-contained app." - exit 1 -) diff --git a/publish.csx b/publish.csx new file mode 100644 index 00000000..270faa03 --- /dev/null +++ b/publish.csx @@ -0,0 +1,173 @@ +#r "nuget: System.Diagnostics.Process, 4.3.0" + +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.IO.Compression; + +// Define output path for published applications +var output = "artifacts/Publish/"; +var platforms = new List(){"win-x64", "linux-x64", "osx-x64", "osx-arm64"}; + +void PublishTools() +{ + var name = "DxFeed.Graal.Net.Tools"; + var framework = "net8.0"; + var project = FindProject(name); + + PublishProjects(new[] { project }, name, framework, true); +} + +void PublishSamples() +{ + var name = "Samples"; + var framework = "net6.0"; + var projects = FindAllProjectInDirectory("samples"); + + PublishProjects(projects, name, framework, false); +} + +void PublishProjects(IEnumerable projects, string name, string framework, bool isSingleFile) +{ + foreach (var project in projects) + { + foreach (var platform in platforms) + { + PublishScd(project, framework, platform, $"{output}/{name}/{platform}", isSingleFile); + } + } + + // Sign the macOS binaries if they exist. + Codesign($"{output}/{name}/osx-x64"); + Codesign($"{output}/{name}/osx-arm64"); + + // Zip the output directory. + ZipDirectory($"{output}/{name}", name, GetVersion()); +} + +// Function to publish self-contained deployment (SCD). +// Publishes the specified .NET project for the given framework and platform. +void PublishScd(string project, string framework, string platform, string output, bool isSingleFile) +{ + ExecuteCommand("dotnet", $"publish" + + $" {project}" + + $" --framework {framework}" + + $" -r {platform}" + + $" -o {output}" + + $" -p:PublishSingleFile={isSingleFile}" + + $" -p:SolutionDir={GetSolutionFolder()}" + + " -p:IncludeNativeLibrariesForSelfExtract=true" + + " -p:AllowedReferenceRelatedFileExtensions=none" + + " -p:DebugType=None" + + " -p:DebugSymbols=false" + + " --self-contained true" + + " -c Release"); +} + +bool CommandExists(string command) +{ + try + { + var process = Process.Start(new ProcessStartInfo + { + FileName = "sh", + Arguments = $"-c \"command -v {command}\"", + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + }); + process.WaitForExit(); + return process.ExitCode == 0; + } + catch + { + return false; + } +} + +void ExecuteCommand(string command, string arguments) +{ + try + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = command, + Arguments = arguments, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + } + }; + + process.OutputDataReceived += (sender, e) => { if (e.Data != null) Console.WriteLine(e.Data); }; + process.ErrorDataReceived += (sender, e) => { if (e.Data != null) Console.WriteLine(e.Data); }; + + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + Console.WriteLine($"Command failed: {command} {arguments}"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Failed to execute command: {command} {arguments}. Error: {ex.Message}"); + } +} + + +// Function to sign macOS applications +// path: Path to the application to be signed +void Codesign(string path) +{ + // Check if codesign is available before attempting to sign + if (CommandExists("codesign")) + { + foreach (var file in Directory.GetFiles(path)) + { + ExecuteCommand("codesign", $"-f -s - {file}"); + } + } +} + +void ZipDirectory(string path, string name, string version) +{ + // Iterate through each directory in the base directory. + foreach (var dir in Directory.GetDirectories(path)) + { + string dirName = Path.GetFileName(dir); // Get the directory name. + string zipFileName = $"{name}-{dirName}-{version}.zip"; // Construct the zip file name. + string zipFilePath = Path.Combine(path, zipFileName); // Full path to the zip file. + + // Compress the directory into a zip file. + if (File.Exists(zipFilePath)) + { + File.Delete(zipFilePath); // Delete the existing zip file if it exists. + } + + ZipFile.CreateFromDirectory(dir, zipFilePath, CompressionLevel.Optimal, false); + Console.WriteLine($"Created zip file: {zipFilePath}"); + } +} + +string FindProject(string name) => + Directory.EnumerateFiles($"{GetSolutionFolder()}", $"{name}.csproj", SearchOption.AllDirectories).First(); + +List FindAllProjectInDirectory(string path) => + Directory.EnumerateFiles($"{GetSolutionFolder()}/{path}", "*.csproj", SearchOption.AllDirectories).ToList(); + +string GetVersion() => + File.ReadLines($"{GetSolutionFolder()}/version.txt").First().Trim(); + +string GetSolutionFolder([CallerFilePath] string path = null) => + Path.GetDirectoryName(path); + +PublishSamples(); +PublishTools(); diff --git a/publish.sh b/publish.sh deleted file mode 100755 index aa311c52..00000000 --- a/publish.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh - -# Define output path for published applications -output_path="artifacts/Publish/" -project_name="" -target_framework="" -target_platform="" - -# Function to sign macOS applications -# $1: Path to the application to be signed -sign() { - path="$1" - # Check if codesign is available before attempting to sign - if command -v codesign > /dev/null; then - codesign -f -s - "$path" - fi -} - -# Function to publish framework-dependent deployment (FDD) -# Publishes the specified .NET project for the given framework -publish_fdd() { - dotnet publish \ - src/"$project_name"/"$project_name".csproj \ - -p:UseAppHost=false \ - -p:DebugType=None \ - -p:DebugSymbols=false \ - --framework "$target_framework" \ - -c Release \ - -o "$output_path"/"$project_name"/"$target_framework"/ -} - -# Function to publish self-contained deployment (SCD) -# Publishes the specified .NET project for the given framework and platform -publish_scd() { - dotnet publish -r "$target_platform" \ - src/"$project_name"/"$project_name".csproj \ - -p:PublishSingleFile=true \ - -p:IncludeNativeLibrariesForSelfExtract=true \ - -p:AllowedReferenceRelatedFileExtensions=none \ - -p:DebugType=None \ - -p:DebugSymbols=false \ - --framework "$target_framework" \ - --self-contained true \ - -c Release \ - -o "$output_path"/"$project_name"/"$target_platform"/ - - # Sign the macOS application if the target platform is macOS - case "$target_platform" in - *osx*) sign "$output_path/$project_name/$target_platform/$project_name" ;; - esac -} - -# Main function to control the script flow -main() { - if [ "$#" -eq 0 ]; then - # Print usage instructions if no arguments are provided - echo "Usage:" - echo " []" - echo "" - echo "Where:" - echo " project Project name." - echo " framework .NET version (net6.0, net7.0, net8.0)." - echo " platform Platform name (win-x64, linux-x64, osx-x64, osx-arm64)" - echo " for self-contained app." - exit 1 - fi - - project_name="$1" - target_framework="$2" - target_platform="$3" - - # Determine which type of deployment to publish based on the number of arguments - if [ "$#" -eq 2 ]; then - publish_fdd - elif [ "$#" -eq 3 ]; then - publish_scd - fi - exit 0 -} - -# Execute the main function with all passed arguments -main "$@" diff --git a/samples/API/AuthSample/AuthSample.csproj b/samples/API/AuthSample/AuthSample.csproj new file mode 100644 index 00000000..61718a1f --- /dev/null +++ b/samples/API/AuthSample/AuthSample.csproj @@ -0,0 +1,3 @@ + + + diff --git a/samples/SimpleAuthSample/Program.cs b/samples/API/AuthSample/Program.cs similarity index 100% rename from samples/SimpleAuthSample/Program.cs rename to samples/API/AuthSample/Program.cs diff --git a/samples/API/ConnectSample/ConnectSample.csproj b/samples/API/ConnectSample/ConnectSample.csproj new file mode 100644 index 00000000..61718a1f --- /dev/null +++ b/samples/API/ConnectSample/ConnectSample.csproj @@ -0,0 +1,3 @@ + + + diff --git a/samples/DxFeedConnect/Program.cs b/samples/API/ConnectSample/Program.cs similarity index 93% rename from samples/DxFeedConnect/Program.cs rename to samples/API/ConnectSample/Program.cs index 66fa225e..32986fc2 100644 --- a/samples/DxFeedConnect/Program.cs +++ b/samples/API/ConnectSample/Program.cs @@ -24,7 +24,7 @@ private static void PrintUsage() var eventTypeNames = ReflectionUtil.CreateTypesString(DXEndpoint.GetEventTypes()); var usageString = $@" Usage: -DxFeedConnect
[