From cfcfca003eabe105ac9e969eb9a58a4b6a37e2aa Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:03:39 +0300 Subject: [PATCH 01/19] Add initial project structure with dependencies and configuration files --- .dockerignore | 17 + .editorconfig | 189 +++ .gitattributes | 5 + .github/workflows/dotnet.yml | 81 ++ .gitignore | 356 ++++++ Directory.Build.props | 60 + Directory.Build.targets | 19 + Directory.Packages.props | 31 + Integrations.slnx | 39 + LICENSE | 2 +- NuGet.Config | 20 + PackageLicenses.txt | 115 ++ README.md | 165 ++- ...aScienceHub.Integrations.Benchmarks.csproj | 26 + .../Ace/AceMagnetometerDataParserBenchmark.cs | 31 + .../AceSolarWindPlasmaDataParserBenchmark.cs | 31 + .../Ace/Samples/AceMagnetometerSample.txt | 139 +++ .../Noaa/Ace/Samples/AceSwepamSample.txt | 137 +++ .../DscovrMagnetometerDataParserBenchmark.cs | 31 + ...scovrSolarWindPlasmaDataParserBenchmark.cs | 31 + .../Samples/DscovrMagnetometerSample.json | 1055 +++++++++++++++++ .../Samples/DscovrSolarWindPlasmaSample.json | 710 +++++++++++ .../Program.cs | 9 + docs/logo/Fw_black.png | Bin 0 -> 124625 bytes docs/logo/Fw_icon.png | Bin 0 -> 9647 bytes docs/logo/Fw_white.png | Bin 0 -> 120824 bytes global.json | 7 + package.json | 5 + src/Directory.Build.props | 26 + src/ExternalResources/Ace/AceClient.cs | 40 + .../Ace/Extensions/MagnetometerDataParser.cs | 67 ++ .../Extensions/SolarWindPlasmaDataParser.cs | 70 ++ src/ExternalResources/Ace/IAceClient.cs | 19 + .../Ace/Responses/MagnetometerRecord.cs | 22 + .../Ace/Responses/SolarWindPlasmaRecord.cs | 17 + src/ExternalResources/Dscovr/DscovrClient.cs | 72 ++ .../Extensions/MagnetometerDataParser.cs | 90 ++ .../Extensions/SolarWindPlasmaDataParser.cs | 84 ++ src/ExternalResources/Dscovr/IDscovrClient.cs | 49 + .../Dscovr/Responses/MagnetometerRecord.cs | 20 + .../Dscovr/Responses/SolarWindPlasmaRecord.cs | 15 + .../ExternalResources.csproj | 14 + .../Infrastructure/ApiResource.cs | 28 + .../Configuration/AariGeophysClientBase.cs | 36 + .../Configuration/AariGeophysClientOptions.cs | 17 + .../Configuration/NoaaClientOptions.cs | 12 + .../Extensions/KpIndex27DayDataParser.cs | 83 ++ .../Extensions/KpIndex3DayDataParser.cs | 75 ++ .../Extensions/KpIndexNowcastDataParser.cs | 82 ++ .../KpIndex/IKpIndexClient.cs | 24 + .../KpIndex/KpIndexClient.cs | 50 + .../KpIndex/Responses/KpIndex27DayResponse.cs | 10 + .../KpIndex/Responses/KpIndex3DayResponse.cs | 8 + .../Responses/KpIndexNowcastResponse.cs | 12 + .../PcIndex/Extensions/PcIndexDataParser.cs | 66 ++ .../PcIndex/IPcIndexClient.cs | 19 + .../PcIndex/PcIndexClient.cs | 34 + .../PcIndex/Responses/PcIndexResponse.cs | 8 + .../ServiceCollectionExtensions.cs | 26 + src/Noaa/Ace/AceClient.cs | 39 + .../Ace/Extensions/MagnetometerDataParser.cs | 67 ++ .../Extensions/SolarWindPlasmaDataParser.cs | 70 ++ src/Noaa/Ace/IAceClient.cs | 19 + src/Noaa/Ace/Responses/MagnetometerRecord.cs | 22 + .../Ace/Responses/SolarWindPlasmaRecord.cs | 17 + src/Noaa/Dscovr/DscovrClient.cs | 71 ++ .../Extensions/MagnetometerDataParser.cs | 88 ++ .../Extensions/SolarWindPlasmaDataParser.cs | 82 ++ src/Noaa/Dscovr/IDscovrClient.cs | 49 + .../Dscovr/Responses/MagnetometerRecord.cs | 20 + .../Dscovr/Responses/SolarWindPlasmaRecord.cs | 15 + .../Extensions/KpIndex27DayDataParser.cs | 83 ++ .../Extensions/KpIndex3DayDataParser.cs | 75 ++ .../Extensions/KpIndexNowcastDataParser.cs | 82 ++ src/Noaa/KpIndex/IKpIndexClient.cs | 24 + src/Noaa/KpIndex/KpIndexClient.cs | 49 + .../KpIndex/Responses/KpIndex27DayResponse.cs | 10 + .../KpIndex/Responses/KpIndex3DayResponse.cs | 8 + .../Responses/KpIndexNowcastResponse.cs | 12 + src/Noaa/Noaa.csproj | 14 + src/Noaa/NoaaClientOptions.cs | 24 + src/Noaa/ServiceCollectionExtensions.cs | 27 + tests/Directory.Build.props | 25 + .../Noaa/Ace/MagnetometerDataParserTests.cs | 58 + .../Ace/Samples/AceMagnetometerSample.txt | 23 + .../Noaa/Ace/Samples/AceSwepamSample.txt | 21 + .../Ace/SolarWindPlasmaDataParserTests.cs | 49 + .../Dscovr/MagnetometerDataParserTests.cs | 45 + .../Samples/DscovrMagnetometerSample.json | 29 + .../Samples/DscovrSolarWindPlasmaSample.json | 20 + .../Dscovr/SolarWindPlasmaDataParserTests.cs | 39 + .../KpIndex/KpIndex27DayDataParserTests.cs | 50 + .../KpIndex/KpIndex3DayDataParserTests.cs | 50 + .../KpIndex/KpIndexNowcastDataParserTests.cs | 55 + .../Samples/KpIndex27DayForecastSample.txt | 18 + .../Samples/KpIndex3DayForecastSample.json | 8 + .../KpIndex/Samples/KpIndexNowcastSample.json | 8 + tests/UnitTests/UnitTests.csproj | 19 + tests/UnitTests/Usings.cs | 1 + .../Utils/EmbeddedResourceDataAttribute.cs | 46 + 100 files changed, 6034 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/workflows/dotnet.yml create mode 100644 .gitignore create mode 100644 Directory.Build.props create mode 100644 Directory.Build.targets create mode 100644 Directory.Packages.props create mode 100644 Integrations.slnx create mode 100644 NuGet.Config create mode 100644 PackageLicenses.txt create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceMagnetometerSample.txt create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceSwepamSample.txt create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/Program.cs create mode 100644 docs/logo/Fw_black.png create mode 100644 docs/logo/Fw_icon.png create mode 100644 docs/logo/Fw_white.png create mode 100644 global.json create mode 100644 package.json create mode 100644 src/Directory.Build.props create mode 100644 src/ExternalResources/Ace/AceClient.cs create mode 100644 src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs create mode 100644 src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs create mode 100644 src/ExternalResources/Ace/IAceClient.cs create mode 100644 src/ExternalResources/Ace/Responses/MagnetometerRecord.cs create mode 100644 src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs create mode 100644 src/ExternalResources/Dscovr/DscovrClient.cs create mode 100644 src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs create mode 100644 src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs create mode 100644 src/ExternalResources/Dscovr/IDscovrClient.cs create mode 100644 src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs create mode 100644 src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs create mode 100644 src/ExternalResources/ExternalResources.csproj create mode 100644 src/ExternalResources/Infrastructure/ApiResource.cs create mode 100644 src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs create mode 100644 src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs create mode 100644 src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs create mode 100644 src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs create mode 100644 src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs create mode 100644 src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs create mode 100644 src/ExternalResources/KpIndex/IKpIndexClient.cs create mode 100644 src/ExternalResources/KpIndex/KpIndexClient.cs create mode 100644 src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs create mode 100644 src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs create mode 100644 src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs create mode 100644 src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs create mode 100644 src/ExternalResources/PcIndex/IPcIndexClient.cs create mode 100644 src/ExternalResources/PcIndex/PcIndexClient.cs create mode 100644 src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs create mode 100644 src/ExternalResources/ServiceCollectionExtensions.cs create mode 100644 src/Noaa/Ace/AceClient.cs create mode 100644 src/Noaa/Ace/Extensions/MagnetometerDataParser.cs create mode 100644 src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs create mode 100644 src/Noaa/Ace/IAceClient.cs create mode 100644 src/Noaa/Ace/Responses/MagnetometerRecord.cs create mode 100644 src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs create mode 100644 src/Noaa/Dscovr/DscovrClient.cs create mode 100644 src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs create mode 100644 src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs create mode 100644 src/Noaa/Dscovr/IDscovrClient.cs create mode 100644 src/Noaa/Dscovr/Responses/MagnetometerRecord.cs create mode 100644 src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs create mode 100644 src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs create mode 100644 src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs create mode 100644 src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs create mode 100644 src/Noaa/KpIndex/IKpIndexClient.cs create mode 100644 src/Noaa/KpIndex/KpIndexClient.cs create mode 100644 src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs create mode 100644 src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs create mode 100644 src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs create mode 100644 src/Noaa/Noaa.csproj create mode 100644 src/Noaa/NoaaClientOptions.cs create mode 100644 src/Noaa/ServiceCollectionExtensions.cs create mode 100644 tests/Directory.Build.props create mode 100644 tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/Ace/Samples/AceMagnetometerSample.txt create mode 100644 tests/UnitTests/Noaa/Ace/Samples/AceSwepamSample.txt create mode 100644 tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json create mode 100644 tests/UnitTests/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json create mode 100644 tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs create mode 100644 tests/UnitTests/Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt create mode 100644 tests/UnitTests/Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json create mode 100644 tests/UnitTests/Noaa/KpIndex/Samples/KpIndexNowcastSample.json create mode 100644 tests/UnitTests/UnitTests.csproj create mode 100644 tests/UnitTests/Usings.cs create mode 100644 tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..36afbbb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +.git +.gitignore +.vs/ +.vscode/ +.idea/ +.dockerignore + +docs/ + +**/*.user +**/*.md +**/bin/ +**/obj/ +**/out/ + +Dockerfile +README.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3895306 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,189 @@ +# editorconfig.org + +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +charset = utf-8 +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[project.json] +indent_size = 2 + +# C# files +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +#csharp_style_var_for_built_in_types = false:suggestion +#csharp_style_var_when_type_is_apparent = false:none +#csharp_style_var_elsewhere = false:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = error +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style + +# static fields should have s_ prefix +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style + +# internal and private fields should be _camelCase +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = error +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +dotnet_sort_system_directives_first = true +csharp_prefer_braces = true +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion + +# Code quality +dotnet_style_readonly_field = true:suggestion +dotnet_code_quality_unused_parameters = non_public:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = true +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = true +csharp_style_expression_bodied_constructors = true +csharp_style_expression_bodied_operators = true +csharp_style_expression_bodied_properties = true +csharp_style_expression_bodied_indexers = true +csharp_style_expression_bodied_accessors = true +csharp_style_expression_bodied_lambdas = true +csharp_style_expression_bodied_local_functions = true + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Analyzers +dotnet_code_quality.ca1802.api_surface = private, internal +dotnet_code_quality.CA2208.api_surface = public + +# C++ Files +[*.{cpp,h,in}] +curly_bracket_next_line = true +indent_brace_style = Allman + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +[*.{csproj,vbproj,proj,nativeproj,locproj}] +charset = utf-8 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{xml,stylecop,resx,ruleset}] +indent_size = 2 + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +[*.{cmd, bat}] +end_of_line = crlf \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..61c139c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for csharp +*.cs diff=csharp diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 0000000..2dd9ff7 --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,81 @@ +name: Release + +on: + push: + branches: + - '**' + tags: + - '*.*.*' + +env: + DOTNET_NOLOGO: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + filter: tree:0 + + - name: Setup dotnet + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Compute version + shell: bash + run: | + BASE=$(sed -n 's|.*\(.*\).*|\1|p' Directory.Build.props | head -n1) + if [[ -z "$BASE" ]]; then + echo "Failed to read PackageBaseVersion from Directory.Build.props" >&2 + exit 1 + fi + + if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then + # Stable on tags + MINVER_VERSION="${BASE}" + PKG_VERSION="${BASE}" + elif [[ "${GITHUB_REF_NAME}" == "main" ]]; then + # Stable with 4th component on main (no -main) + MINVER_VERSION="${BASE}" # SemVer for MinVer + PKG_VERSION="${BASE}.${GITHUB_RUN_NUMBER}" # 4-part NuGet version + else + # Pre-release on other branches: base-branch.runNumber + SAFE_BRANCH=$(echo "${GITHUB_REF_NAME}" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^0-9a-zA-Z.-]+/-/g' | sed -E 's/^-+|-+$//g') + MINVER_VERSION="${BASE}-${SAFE_BRANCH}.${GITHUB_RUN_NUMBER}" + PKG_VERSION="${MINVER_VERSION}" + fi + + echo "MINVER_VERSION=${MINVER_VERSION}" >> "$GITHUB_ENV" + echo "PKG_VERSION=${PKG_VERSION}" >> "$GITHUB_ENV" + echo "MinVer: ${MINVER_VERSION}" + echo "Package: ${PKG_VERSION}" + + - name: Restore + run: dotnet restore + + - name: Build + run: dotnet build --no-restore --configuration Release -p:MinVerVersionOverride=${MINVER_VERSION} + + - name: Test + run: dotnet test --no-build --configuration Release --verbosity normal -p:MinVerVersionOverride=${MINVER_VERSION} + + - name: Pack + run: dotnet pack --no-build --configuration Release --output ./artifacts -p:MinVerVersionOverride=${MINVER_VERSION} -p:PackageVersion=${PKG_VERSION} + + - name: Push to GitHub Packages + if: ${{ github.ref_name != 'main' }} + env: + GH_API_KEY: ${{ secrets.GH_PACKAGES_NUGET_API_KEY }} + run: dotnet nuget push ./artifacts/*.nupkg --source AuroraScienceHub --api-key $GH_API_KEY --skip-duplicate + + - name: Push to NuGet.org + if: ${{ github.ref_name == 'main' }} + env: + NUGET_URL: https://api.nuget.org/v3/index.json + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + run: dotnet nuget push ./artifacts/*.nupkg --source $NUGET_URL --api-key $NUGET_API_KEY --skip-duplicate diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a6afa6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,356 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# Postgres mount folder +postgres-mnt/ + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# JetBrains IDEA files +.idea/ diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..fe445b4 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,60 @@ + + + + net10.0 + latest + False + enable + enable + + 9999 + True + True + $(NoWarn);NU5104 + + + + true + embedded + true + + + + AuroraScienceHub + $([System.DateTime]::Now.ToString(yyyy)) + + Copyright $(CurrentYear) © $(CompanyName). All rights reserved + $(CompanyName) + $(CompanyName) + + + + 10.0.0 + + + + + + + + + + + + + + + All + + + All + + + all + runtime; build; native; contentfiles; analyzers + + + diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..52ee0fb --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,19 @@ + + + + $(AssemblyName) + + + + + https://github.com/Aurora-Science-Hub/Integrations + https://github.com/Aurora-Science-Hub/Integrations.git + git + True + MIT + Framework;AuroraScienceHub;Science;Integrations + + + diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 0000000..f5b578d --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,31 @@ + + + true + true + true + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + \ No newline at end of file diff --git a/Integrations.slnx b/Integrations.slnx new file mode 100644 index 0000000..b8dd0fd --- /dev/null +++ b/Integrations.slnx @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE index deb6ddd..2fb30de 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Aurora Science Hub +Copyright (c) 2025 Aurora Science Hub Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 0000000..f4833d2 --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/PackageLicenses.txt b/PackageLicenses.txt new file mode 100644 index 0000000..e5affea --- /dev/null +++ b/PackageLicenses.txt @@ -0,0 +1,115 @@ ++------------------------------------------------------------+-------------------------+----------------------------+--------------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Package | Version | License Information Origin | License Expression | License Url | Copyright | Authors | Package Project Url | Error | Error Context | ++------------------------------------------------------------+-------------------------+----------------------------+--------------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| App.Metrics.Abstractions | 4.3.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Allan Hardy 2016 | Allan Hardy and Contributors | https://app-metrics.io/ | | | +| Asp.Versioning.Http | 8.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © .NET Foundation. All rights reserved. | .NET Foundation and Contributors | https://github.com/dotnet/aspnet-api-versioning/wiki | | | +| Asp.Versioning.Mvc | 8.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © .NET Foundation. All rights reserved. | .NET Foundation and Contributors | https://github.com/dotnet/aspnet-api-versioning/wiki | | | +| Asp.Versioning.Mvc.ApiExplorer | 8.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © .NET Foundation. All rights reserved. | .NET Foundation and Contributors | https://github.com/dotnet/aspnet-api-versioning/wiki | | | +| Aspire.Dashboard.Sdk.osx-arm64 | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Aspire.Hosting | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Aspire.Hosting.AppHost | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Aspire.Hosting.Garnet | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Aspire.Hosting.Orchestration.osx-arm64 | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Aspire.Hosting.PostgreSQL | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Aspire.Hosting.RabbitMQ | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| AspNetCore.HealthChecks.NpgSql | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | | Xabaril Contributors | https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks | | | +| AspNetCore.HealthChecks.Sqlite | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | | Xabaril Contributors | https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks | | | +| AspNetCore.HealthChecks.UI.Client | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | | Xabaril Contributors | https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks | | | +| AuroraScienceHub.SWeather.Draw.Plotting | 1.10.132 | Expression | GPL-3.0-or-later | https://licenses.nuget.org/GPL-3.0-or-later | Copyright 2025 © AuroraScienceHub. All rights reserved | AuroraScienceHub | https://github.com/Aurora-Science-Hub/SWeather-draw | | | +| AuroraScienceHub.SWeather.Physics.CouplingFunctions | 1.1.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2024 © AuroraScienceHub. All rights reserved | AuroraScienceHub | https://github.com/Aurora-Science-Hub/SWeather-physics | | | +| AutoFixture.AutoMoq | 4.18.1 | Expression | MIT | https://licenses.nuget.org/MIT | Copyright © Ploeh 2011 | Mark Seemann,AutoFixture | https://github.com/AutoFixture/AutoFixture | | | +| BenchmarkDotNet | 0.14.0 | Expression | MIT | https://licenses.nuget.org/MIT | .NET Foundation and contributors | .NET Foundation and contributors | https://github.com/dotnet/BenchmarkDotNet | | | +| ChatGptNet | 3.3.9 | Expression | MIT | https://licenses.nuget.org/MIT | | Marco Minerva | https://github.com/marcominerva/ChatGptNet | | | +| ClickHouse.Client | 7.8.2 | Expression | MIT | https://licenses.nuget.org/MIT | | Oleg Kozlyuk | https://github.com/DarkWanderer/ClickHouse.Client | | | +| coverlet.collector | 6.0.2 | Expression | MIT | https://licenses.nuget.org/MIT | | tonerdo | https://github.com/coverlet-coverage/coverlet | | | +| Dapper | 2.1.35 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | 2019 Stack Exchange, Inc. | Sam Saffron,Marc Gravell,Nick Craver | https://github.com/DapperLib/Dapper | | | +| DeepL.net | 1.15.0 | Expression | MIT | https://licenses.nuget.org/MIT | | DeepL SE | https://www.deepl.com/pro-api | | | +| EFCore.NamingConventions | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2023 © Shay Rojansky | Shay Rojansky | | | | +| FluentAssertions | 6.12.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright Dennis Doomen 2010-2024 | Dennis Doomen,Jonas Nyrup | https://www.fluentassertions.com/ | | | +| HtmlAgilityPack | 1.11.71 | Expression | MIT | https://licenses.nuget.org/MIT | Copyright © ZZZ Projects Inc. | ZZZ Projects,Simon Mourrier,Jeff Klawiter,Stephan Grell | http://html-agility-pack.net/ | | | +| MassTransit | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | +| MassTransit.Abstractions | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | +| MassTransit.EntityFrameworkCore | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | +| MassTransit.RabbitMQ | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | +| Mediator.Abstractions | 3.0.1 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright 2022 Martin Othamar | Martin Othamar | https://github.com/martinothamar/Mediator | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Framework/AspNetCore/AspNetCore.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Host/Host.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataImport/Application/Application.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataImport/InternalClient/InternalClient.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataProcess/InternalClient/InternalClient.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataProcess/Application/Application.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/Visualization/Application/Application.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PopularScience/Application/Application.csproj | +| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/Ice/Application/Application.csproj | +| Mediator.SourceGenerator | 3.0.1 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright 2022 Martin Othamar | Martin Othamar | https://github.com/martinothamar/Mediator | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Host/Host.csproj | +| Meziantou.Extensions.Logging.Xunit.v3 | 1.1.2 | Expression | MIT | https://licenses.nuget.org/MIT | | Meziantou | https://github.com/meziantou/Meziantou.Framework | | | +| Microsoft.AspNetCore.Mvc.Testing | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | +| Microsoft.AspNetCore.OpenApi | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | +| Microsoft.CodeAnalysis | 4.9.2 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | +| Microsoft.CodeAnalysis | 4.13.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | +| Microsoft.CodeAnalysis.Analyzers | 3.3.4 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn-analyzers | | | +| Microsoft.CodeAnalysis.Analyzers | 3.11.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn-analyzers | | | +| Microsoft.CodeAnalysis.Workspaces.Common | 4.13.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | +| Microsoft.CodeAnalysis.Workspaces.MSBuild | 4.13.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | +| Microsoft.EntityFrameworkCore | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | +| Microsoft.EntityFrameworkCore.Design | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | +| Microsoft.EntityFrameworkCore.Relational | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | +| Microsoft.EntityFrameworkCore.Tools | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | +| Microsoft.Extensions.Caching.Abstractions | 9.0.2 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Caching.Hybrid | 9.2.0-preview.1.25105.6 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Caching.StackExchangeRedis | 9.0.2 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | +| Microsoft.Extensions.Configuration | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Configuration.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Configuration.Binder | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Configuration.CommandLine | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Configuration.EnvironmentVariables | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Configuration.FileExtensions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Configuration.Json | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.DependencyInjection | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.DependencyInjection.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | +| Microsoft.Extensions.Diagnostics.Testing | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Hosting.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Http | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Http.Resilience | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Localization.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | +| Microsoft.Extensions.Logging | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Logging.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Options | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.Options.ConfigurationExtensions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.Extensions.ServiceDiscovery | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | +| Microsoft.Extensions.TimeProvider.Testing | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Microsoft.NET.Test.Sdk | 17.11.1 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/microsoft/vstest | | | +| Moq | 4.20.72 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors. All rights reserved. | Daniel Cazzulino, kzu | https://github.com/moq/moq | | | +| NetTopologySuite | 2.6.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright © 2006 - 2025 NetTopologySuite - Team, Diego Guidi, John Diss (www.newgrove.com), Felix Obermaier (www.ivv-aachen.de), Todd Jackson, Joe Amenta | NetTopologySuite - Team | | | | +| NetTopologySuite.IO.GeoJSON | 4.0.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright © 2023 NetTopologySuite - Team | NetTopologySuite - Team | | | | +| NetTopologySuite.IO.PostGis | 2.1.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright © 2021 NetTopologySuite - Team | NetTopologySuite - Team | | | | +| Npgsql.EntityFrameworkCore.PostgreSQL | 9.0.1 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky,Austin Drenski,Yoh Deadfall | https://github.com/npgsql/efcore.pg | | | +| Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite | 9.0.1 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky | https://github.com/npgsql/efcore.pg | | | +| Npgsql.NetTopologySuite | 9.0.1 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky,Yoh Deadfall | https://github.com/npgsql/npgsql | | | +| Npgsql.OpenTelemetry | 9.0.2 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky | https://github.com/npgsql/npgsql | | | +| Nuke.Common | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | Copyright 2024 Maintainers of NUKE | Matthias Koch and contributors | https://nuke.build/ | | | +| OpenTelemetry | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Exporter.Console | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Exporter.OpenTelemetryProtocol | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Exporter.Prometheus.AspNetCore | 1.11.2-beta.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Extensions.Hosting | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Instrumentation.AspNetCore | 1.11.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Instrumentation.EntityFrameworkCore | 1.11.0-beta.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Instrumentation.GrpcNetClient | 1.11.0-beta.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Instrumentation.Http | 1.11.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Instrumentation.Process | 1.11.0-beta.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| OpenTelemetry.Instrumentation.Runtime | 1.11.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | +| Polly | 8.5.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright (c) 2024, App vNext | Michael Wolfenden, App vNext | https://github.com/App-vNext/Polly | | | +| Respawn | 6.2.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright Jimmy Bogard | Jimmy Bogard | | | | +| Scalar.AspNetCore | 2.0.18 | Expression | MIT | https://licenses.nuget.org/MIT | | Scalar | https://scalar.com/ | | | +| Scriban | 6.3.0 | Expression | BSD-2-Clause | https://licenses.nuget.org/BSD-2-Clause | Alexandre Mutel | Alexandre Mutel | https://github.com/lunet-io/scriban | | | +| StackExchange.Redis | 2.8.22 | Expression | MIT | https://licenses.nuget.org/MIT | 2014 - 2024 Stack Exchange, Inc. | Stack Exchange, Inc.,Marc Gravell,Nick Craver | https://stackexchange.github.io/StackExchange.Redis/ | | | +| System.CommandLine | 2.0.0-beta4.22272.1 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/command-line-api | | | +| System.Net.Http.Json | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| System.Text.Json | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | +| Tesseract | 5.2.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2012-2020 Charles Weld | Charles Weld | https://github.com/charlesw/tesseract/ | | | +| Testcontainers.PostgreSql | 4.0.0 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright (c) 2019 - 2024 Andre Hofmeister and other authors | Andre Hofmeister and contributors | https://dotnet.testcontainers.org/ | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/tests/IntegrationTests/IntegrationTests.csproj | +| Testcontainers.RabbitMq | 4.0.0 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright (c) 2019 - 2024 Andre Hofmeister and other authors | Andre Hofmeister and contributors | https://dotnet.testcontainers.org/ | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/tests/IntegrationTests/IntegrationTests.csproj | +| xunit.runner.visualstudio | 3.0.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright (C) .NET Foundation | jnewkirk,bradwilson | | | | +| xunit.v3 | 2.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright (C) .NET Foundation | jnewkirk,bradwilson | | | | ++------------------------------------------------------------+-------------------------+----------------------------+--------------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ diff --git a/README.md b/README.md index 533f660..cf3b1f9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,163 @@ -# Integrations -Integrations with third-party data sources +

+
+ + + + + +
+ Aurora Science Hub Framework +
+

+
+ A comprehensive collection of reusable infrastructure packages for building modern .NET 9 applications. +

+ +[![](https://img.shields.io/badge/.NET-9.0-512BD4)](https://dotnet.microsoft.com/) +[![](https://img.shields.io/badge/C%23-13.0-239120)](https://learn.microsoft.com/en-us/dotnet/csharp/) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Aurora-Science-Hub/Framework/blob/main/LICENSE) +[![Build & test](https://github.com/Aurora-Science-Hub/Framework/actions/workflows/dotnet.yml/badge.svg)](https://github.com/Aurora-Science-Hub/Framework/actions/workflows/dotnet.yml) + +Available Packages • +Architecture • +Development • +Code Style • +Testing • +Licence • +Contributing + +
+ + +## Getting Started + +All packages are distributed via NuGet and target **.NET 9.0**. Install individual packages as needed: + +```bash +dotnet add package AuroraScienceHub.Framework.Composition +dotnet add package AuroraScienceHub.Framework.AspNetCore +dotnet add package AuroraScienceHub.Framework.EntityFramework +# ... other packages +``` + +Each package includes its own README with detailed usage instructions and examples. + +## Available Packages + +### Core Infrastructure + +- **[Composition](src/Composition/)** - Modular architecture framework with service and application modules +- **[Configuration](src/Configuration/)** - Type-safe configuration loading with validation +- **[Diagnostics](src/Diagnostics/)** - Health checks, application descriptors, and monitoring utilities +- **[Exceptions](src/Exceptions/)** - Common exception types and error handling patterns +- **[Utilities](src/Utilities/)** - General-purpose utility classes and extension methods + +### Web & API + +- **[AspNetCore](src/AspNetCore/)** - ASP.NET Core extensions, problem details, security, and routing +- **[Http](src/Http/)** - HTTP client utilities and extensions + +### Data Access + +- **[Entities](src/Entities/)** - Domain entity interfaces, strong-typed IDs, and DDD patterns +- **[EntityFramework](src/EntityFramework/)** - EF Core extensions with auditing, soft deletes, and migrations +- **[EntityFramework.NpgSql](src/EntityFramework.NpgSql/)** - PostgreSQL-specific DbContext factories and conventions +- **[ClickHouse](src/ClickHouse/)** - ClickHouse database integration + +### Caching & Performance + +- **[Caching](src/Caching/)** - Hybrid cache extensions and utilities + +### Logging & Observability + +- **[Logging.OpenTelemetry](src/Logging.OpenTelemetry/)** - OpenTelemetry integration for distributed tracing + +### AI & Machine Learning + +- **[Ai](src/Ai/)** - OpenAI GPT and DeepL translation service integrations +- **[Ocr](src/Ocr/)** - Optical Character Recognition utilities + +### Serialization + +- **[Json](src/Json/)** - JSON serialization extensions and converters + +## Architecture + +The framework follows these principles: + +- **Modular Design** - Each package is self-contained and can be used independently +- **Clean Architecture** - Clear separation of concerns with minimal coupling +- **Domain-Driven Design** - Support for DDD patterns and practices +- **Type Safety** - Strong typing with nullable reference types enabled +- **Modern .NET** - Leverages latest .NET 9 features and patterns + +## Development + +### Prerequisites + +- .NET 9.0 SDK or later +- IDE with C# support (Rider, Visual Studio, VS Code) + +### Building the Solution + +```bash +# Restore dependencies +dotnet restore + +# Build all projects +dotnet build + +# Run tests +dotnet test + +# Create NuGet packages +dotnet pack +``` + +## Code Style + +The solution uses [EditorConfig](.editorconfig) based on [Azure SDK .NET](https://github.com/Azure/azure-sdk-for-net/blob/main/.editorconfig) to maintain consistent code style across all packages. + +### Formatting Commands + +```bash +# Format code before committing +dotnet format + +# Verify code style compliance +dotnet format --verify-no-changes +``` + +### Code Quality Standards + +- Nullable reference types enabled +- Warnings treated as errors +- Latest C# language version +- Code style enforcement in build +- Embedded debug symbols in packages + +## Testing + +Unit tests are located in the `tests/UnitTests/` directory. The framework uses: + +- xUnit for test execution +- AutoFixture with AutoMoq for test data generation +- Moq for mocking + +## License + +See [LICENSE](LICENSE) and [PackageLicenses.txt](PackageLicenses.txt) for details. + +## Contributing + +When contributing to this repository: + +1. Follow the established code style (enforced by EditorConfig) +2. Run `dotnet format` before committing +3. Ensure all tests pass +4. Update relevant README files for your changes +5. Keep packages focused and loosely coupled + +--- + +**Note**: This framework is designed for Aurora Science Hub applications but can be used in any modern .NET project requiring robust infrastructure components. diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj new file mode 100644 index 0000000..f544fea --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj @@ -0,0 +1,26 @@ + + + + AuroraScienceHub.Integrations.Benchmarks + Exe + false + + false + + + + + + + + + + + + + + + + + + diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs new file mode 100644 index 0000000..a6b8f3c --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs @@ -0,0 +1,31 @@ +using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using BenchmarkDotNet.Attributes; + +namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace; + +/// +/// Benchmarks for (ACE). +/// +[MemoryDiagnoser(false)] +public class AceMagnetometerDataParserBenchmark +{ + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace.Samples.AceMagnetometerSample.txt"; + + private string _text = string.Empty; + + [GlobalSetup] + public async Task Setup() + { + await using var stream = typeof(AceMagnetometerDataParserBenchmark).Assembly + .GetManifestResourceStream(ResourceName) + ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); + using var reader = new StreamReader(stream); + _text = await reader.ReadToEndAsync(); + } + + [Benchmark] + public void Parse() + { + MagnetometerDataParser.Parse(_text); + } +} diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs new file mode 100644 index 0000000..d0d82c6 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs @@ -0,0 +1,31 @@ +using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using BenchmarkDotNet.Attributes; + +namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace; + +/// +/// Benchmarks for (ACE). +/// +[MemoryDiagnoser(false)] +public class AceSolarWindPlasmaDataParserBenchmark +{ + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace.Samples.AceSwepamSample.txt"; + + private string _text = string.Empty; + + [GlobalSetup] + public async Task Setup() + { + await using var stream = typeof(AceMagnetometerDataParserBenchmark).Assembly + .GetManifestResourceStream(ResourceName) + ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); + using var reader = new StreamReader(stream); + _text = await reader.ReadToEndAsync(); + } + + [Benchmark] + public void Parse() + { + SolarWindPlasmaDataParser.Parse(_text); + } +} diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceMagnetometerSample.txt b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceMagnetometerSample.txt new file mode 100644 index 0000000..7f8c878 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceMagnetometerSample.txt @@ -0,0 +1,139 @@ +:Data_list: ace_mag_1m.txt +:Created: 2024 May 05 1046 UT +# Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center +# Please send comments and suggestions to SWPC.Webmaster@noaa.gov +# +# Magnetometer values are in GSM coordinates. +# +# Units: Bx, By, Bz, Bt in nT +# Units: Latitude degrees +/- 90.0 +# Units: Longitude degrees 0.0 - 360.0 +# Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +# Missing data values: -999.9 +# Source: ACE Satellite - Magnetometer +# +# 1-minute averaged Real-time Interplanetary Magnetic Field Values +# +# Modified Seconds +# UT Date Time Julian of the ---------------- GSM Coordinates --------------- +# YR MO DA HHMM Day Day S Bx By Bz Bt Lat. Long. +#------------------------------------------------------------------------------------ +2024 05 05 0846 60435 31560 0 -0.7 -0.8 -1.9 2.2 -60.5 225.8 +2024 05 05 0847 60435 31620 0 -0.7 -0.8 -1.7 2.0 -57.9 232.0 +2024 05 05 0848 60435 31680 0 -0.8 -1.0 -1.8 2.2 -53.6 229.6 +2024 05 05 0849 60435 31740 0 -0.8 -0.9 -1.8 2.2 -56.9 227.7 +2024 05 05 0850 60435 31800 0 -0.5 -0.6 -1.8 2.0 -65.9 229.0 +2024 05 05 0851 60435 31860 0 -0.5 -0.6 -1.6 1.8 -63.1 227.0 +2024 05 05 0852 60435 31920 0 -0.6 -0.6 -1.3 1.6 -55.9 226.6 +2024 05 05 0853 60435 31980 0 -0.6 -0.6 -1.1 1.4 -51.2 221.1 +2024 05 05 0854 60435 32040 0 -0.7 -0.5 -1.2 1.5 -55.0 217.1 +2024 05 05 0855 60435 32100 0 -0.6 -0.5 -1.4 1.6 -59.0 219.8 +2024 05 05 0856 60435 32160 0 -0.6 -0.6 -1.5 1.8 -59.9 227.2 +2024 05 05 0857 60435 32220 0 -0.6 -0.8 -1.6 1.8 -57.8 232.9 +2024 05 05 0858 60435 32280 0 -0.8 -0.1 -1.7 1.9 -64.4 185.2 +2024 05 05 0859 60435 32340 0 -0.8 0.0 -1.6 1.8 -62.6 177.4 +2024 05 05 0900 60435 32400 0 -0.9 -0.0 -1.6 1.9 -60.4 182.7 +2024 05 05 0901 60435 32460 0 -0.8 -0.1 -1.6 1.8 -62.3 184.7 +2024 05 05 0902 60435 32520 0 -0.7 0.2 -1.6 1.8 -66.5 162.9 +2024 05 05 0903 60435 32580 0 -0.7 0.1 -1.6 1.8 -65.2 169.9 +2024 05 05 0904 60435 32640 0 -0.8 0.4 -1.6 1.9 -60.0 151.5 +2024 05 05 0905 60435 32700 0 -1.0 0.3 -1.2 1.6 -50.0 161.8 +2024 05 05 0906 60435 32760 0 -1.0 0.7 -1.2 1.8 -42.8 144.4 +2024 05 05 0907 60435 32820 0 -1.0 0.9 -1.2 1.8 -42.9 138.0 +2024 05 05 0908 60435 32880 0 -1.1 0.8 -1.2 1.8 -40.6 141.3 +2024 05 05 0909 60435 32940 0 -0.9 0.7 -1.2 1.6 -46.1 142.0 +2024 05 05 0910 60435 33000 0 -0.8 0.8 -1.2 1.6 -47.0 134.6 +2024 05 05 0911 60435 33060 0 -1.0 0.6 -1.3 1.7 -48.5 146.2 +2024 05 05 0912 60435 33120 0 -1.0 0.7 -1.3 1.8 -45.5 146.4 +2024 05 05 0913 60435 33180 0 -1.0 0.9 -1.1 1.7 -38.8 138.7 +2024 05 05 0914 60435 33240 0 -1.0 1.1 -0.9 1.7 -30.1 130.0 +2024 05 05 0915 60435 33300 0 -1.0 1.3 -0.5 1.7 -18.8 127.6 +2024 05 05 0916 60435 33360 0 -0.8 1.3 -0.5 1.6 -18.8 122.4 +2024 05 05 0917 60435 33420 0 -0.8 1.3 -0.4 1.6 -16.1 120.4 +2024 05 05 0918 60435 33480 0 -1.0 1.2 -0.1 1.6 -3.6 129.5 +2024 05 05 0919 60435 33540 0 -1.1 1.2 0.0 1.6 0.7 133.9 +2024 05 05 0920 60435 33600 0 -1.2 1.1 0.1 1.7 3.0 138.6 +2024 05 05 0921 60435 33660 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0922 60435 33720 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0923 60435 33780 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0924 60435 33840 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0925 60435 33900 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0926 60435 33960 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0927 60435 34020 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0928 60435 34080 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0929 60435 34140 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0930 60435 34200 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0931 60435 34260 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0932 60435 34320 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0933 60435 34380 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0934 60435 34440 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0935 60435 34500 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0936 60435 34560 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0937 60435 34620 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0938 60435 34680 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0939 60435 34740 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0940 60435 34800 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0941 60435 34860 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0942 60435 34920 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0943 60435 34980 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0944 60435 35040 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0945 60435 35100 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0946 60435 35160 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0947 60435 35220 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0948 60435 35280 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0949 60435 35340 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0950 60435 35400 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0951 60435 35460 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0952 60435 35520 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0953 60435 35580 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0954 60435 35640 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0955 60435 35700 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0956 60435 35760 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0957 60435 35820 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0958 60435 35880 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 0959 60435 35940 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1000 60435 36000 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1001 60435 36060 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1002 60435 36120 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1003 60435 36180 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1004 60435 36240 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1005 60435 36300 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1006 60435 36360 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1007 60435 36420 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1008 60435 36480 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1009 60435 36540 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1010 60435 36600 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1011 60435 36660 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1012 60435 36720 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1013 60435 36780 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1014 60435 36840 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1015 60435 36900 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1016 60435 36960 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1017 60435 37020 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1018 60435 37080 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1019 60435 37140 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1020 60435 37200 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1021 60435 37260 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1022 60435 37320 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1023 60435 37380 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1024 60435 37440 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1025 60435 37500 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1026 60435 37560 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1027 60435 37620 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1028 60435 37680 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 +2024 05 05 1029 60435 37740 0 2.4 2.4 -0.3 3.4 -5.9 45.2 +2024 05 05 1030 60435 37800 0 2.4 2.6 -0.3 3.6 -5.2 46.6 +2024 05 05 1031 60435 37860 0 2.4 2.3 -0.1 3.3 -1.2 44.2 +2024 05 05 1032 60435 37920 0 2.6 2.6 -0.1 3.7 -1.6 44.4 +2024 05 05 1033 60435 37980 0 2.6 2.6 0.1 3.6 1.0 44.5 +2024 05 05 1034 60435 38040 0 2.6 2.5 0.1 3.6 2.3 43.1 +2024 05 05 1035 60435 38100 0 2.4 3.0 0.7 3.9 10.1 51.0 +2024 05 05 1036 60435 38160 0 2.3 3.0 1.0 3.9 14.1 52.3 +2024 05 05 1037 60435 38220 0 2.3 2.9 1.2 3.9 18.7 51.1 +2024 05 05 1038 60435 38280 0 2.2 2.8 1.4 3.9 21.8 52.1 +2024 05 05 1039 60435 38340 0 2.0 2.8 1.7 3.9 26.4 54.2 +2024 05 05 1040 60435 38400 0 2.1 2.6 1.9 3.8 29.8 51.4 +2024 05 05 1041 60435 38460 0 2.3 2.2 2.2 3.8 34.3 44.0 +2024 05 05 1042 60435 38520 0 2.3 1.8 2.2 3.7 36.3 38.0 +2024 05 05 1043 60435 38580 0 2.3 1.6 2.3 3.6 38.7 34.4 +2024 05 05 1044 60435 38640 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceSwepamSample.txt b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceSwepamSample.txt new file mode 100644 index 0000000..0053849 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceSwepamSample.txt @@ -0,0 +1,137 @@ +:Data_list: ace_swepam_1m.txt +:Created: 2024 May 06 1857 UT +# Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center +# Please send comments and suggestions to SWPC.Webmaster@noaa.gov +# +# Units: Proton density p/cc +# Units: Bulk speed km/s +# Units: Ion tempeture degrees K +# Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +# Missing data values: Density and Speed = -9999.9, Temp. = -1.00e+05 +# Source: ACE Satellite - Solar Wind Electron Proton Alpha Monitor +# +# 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma +# +# Modified Seconds ------------- Solar Wind ----------- +# UT Date Time Julian of the Proton Bulk Ion +# YR MO DA HHMM Day Day S Density Speed Temperature +#------------------------------------------------------------------------- +2024 05 06 1657 60436 61020 1 4.9 475.0 2.38e+05 +2024 05 06 1658 60436 61080 0 4.6 474.2 2.01e+05 +2024 05 06 1659 60436 61140 0 5.2 478.5 2.06e+05 +2024 05 06 1700 60436 61200 1 4.7 468.5 2.04e+05 +2024 05 06 1701 60436 61260 0 4.6 462.5 1.97e+05 +2024 05 06 1702 60436 61320 0 3.8 468.2 2.08e+05 +2024 05 06 1703 60436 61380 0 4.0 468.1 1.54e+05 +2024 05 06 1704 60436 61440 0 4.6 465.1 1.71e+05 +2024 05 06 1705 60436 61500 0 5.0 468.4 2.20e+05 +2024 05 06 1706 60436 61560 0 5.9 483.2 2.61e+05 +2024 05 06 1707 60436 61620 0 6.7 496.9 3.02e+05 +2024 05 06 1708 60436 61680 0 4.7 488.2 2.02e+05 +2024 05 06 1709 60436 61740 0 4.6 487.0 1.99e+05 +2024 05 06 1710 60436 61800 0 4.6 482.9 1.91e+05 +2024 05 06 1711 60436 61860 0 4.6 482.8 2.06e+05 +2024 05 06 1712 60436 61920 0 5.2 -9999.9 -1.00e+05 +2024 05 06 1713 60436 61980 0 5.2 486.9 2.03e+05 +2024 05 06 1714 60436 62040 1 4.9 488.1 1.97e+05 +2024 05 06 1715 60436 62100 1 5.1 487.6 2.21e+05 +2024 05 06 1716 60436 62160 0 5.2 482.7 2.05e+05 +2024 05 06 1717 60436 62220 0 5.7 482.2 2.17e+05 +2024 05 06 1718 60436 62280 0 5.5 480.1 2.28e+05 +2024 05 06 1719 60436 62340 0 5.8 492.0 3.00e+05 +2024 05 06 1720 60436 62400 1 5.5 498.1 3.00e+05 +2024 05 06 1721 60436 62460 1 4.5 469.5 1.89e+05 +2024 05 06 1722 60436 62520 0 4.2 459.7 1.53e+05 +2024 05 06 1723 60436 62580 0 6.5 484.4 2.17e+05 +2024 05 06 1724 60436 62640 0 8.0 485.9 2.23e+05 +2024 05 06 1725 60436 62700 0 4.6 477.3 2.04e+05 +2024 05 06 1726 60436 62760 0 4.1 463.5 1.86e+05 +2024 05 06 1727 60436 62820 0 5.5 489.7 2.70e+05 +2024 05 06 1728 60436 62880 0 5.0 470.3 2.16e+05 +2024 05 06 1729 60436 62940 0 5.9 501.0 2.86e+05 +2024 05 06 1730 60436 63000 0 4.5 463.6 1.84e+05 +2024 05 06 1731 60436 63060 1 5.8 479.3 1.94e+05 +2024 05 06 1732 60436 63120 0 5.5 491.9 2.26e+05 +2024 05 06 1733 60436 63180 1 5.4 476.3 2.02e+05 +2024 05 06 1734 60436 63240 0 5.0 508.8 2.69e+05 +2024 05 06 1735 60436 63300 0 3.9 517.0 2.98e+05 +2024 05 06 1736 60436 63360 0 3.7 512.9 3.04e+05 +2024 05 06 1737 60436 63420 0 4.2 509.3 3.12e+05 +2024 05 06 1738 60436 63480 0 4.0 503.9 2.86e+05 +2024 05 06 1739 60436 63540 0 3.1 490.9 2.05e+05 +2024 05 06 1740 60436 63600 1 4.4 488.4 1.37e+05 +2024 05 06 1741 60436 63660 0 7.6 519.9 1.96e+05 +2024 05 06 1742 60436 63720 0 4.0 492.0 2.75e+05 +2024 05 06 1743 60436 63780 1 3.4 475.0 1.16e+05 +2024 05 06 1744 60436 63840 0 2.7 477.5 1.84e+05 +2024 05 06 1745 60436 63900 9 -9999.9 -9999.9 -1.00e+05 +2024 05 06 1746 60436 63960 3 -9999.9 -9999.9 -1.00e+05 +2024 05 06 1747 60436 64020 1 1.7 443.4 4.39e+04 +2024 05 06 1748 60436 64080 0 4.0 485.9 2.27e+05 +2024 05 06 1749 60436 64140 0 4.8 497.0 2.64e+05 +2024 05 06 1750 60436 64200 0 4.8 498.0 2.62e+05 +2024 05 06 1751 60436 64260 0 4.7 494.9 2.59e+05 +2024 05 06 1752 60436 64320 0 5.1 497.4 2.51e+05 +2024 05 06 1753 60436 64380 0 5.2 499.9 2.41e+05 +2024 05 06 1754 60436 64440 0 5.0 498.2 2.41e+05 +2024 05 06 1755 60436 64500 1 4.8 497.5 2.54e+05 +2024 05 06 1756 60436 64560 0 4.6 496.1 2.66e+05 +2024 05 06 1757 60436 64620 0 4.9 492.7 2.67e+05 +2024 05 06 1758 60436 64680 0 5.2 499.6 2.84e+05 +2024 05 06 1759 60436 64740 0 5.1 512.4 3.22e+05 +2024 05 06 1800 60436 64800 0 4.6 507.0 3.06e+05 +2024 05 06 1801 60436 64860 0 5.2 491.5 2.51e+05 +2024 05 06 1802 60436 64920 0 4.6 454.5 1.86e+05 +2024 05 06 1803 60436 64980 0 0.7 407.5 7.84e+04 +2024 05 06 1804 60436 65040 0 3.9 485.8 2.63e+05 +2024 05 06 1805 60436 65100 1 4.8 488.0 2.38e+05 +2024 05 06 1806 60436 65160 0 4.0 462.0 1.70e+05 +2024 05 06 1807 60436 65220 0 4.4 486.6 2.41e+05 +2024 05 06 1808 60436 65280 0 5.0 510.4 3.35e+05 +2024 05 06 1809 60436 65340 0 4.9 503.4 3.46e+05 +2024 05 06 1810 60436 65400 0 4.4 472.2 2.56e+05 +2024 05 06 1811 60436 65460 0 4.7 465.3 2.23e+05 +2024 05 06 1812 60436 65520 0 5.6 501.5 3.23e+05 +2024 05 06 1813 60436 65580 0 5.6 500.6 3.25e+05 +2024 05 06 1814 60436 65640 0 5.1 488.8 3.29e+05 +2024 05 06 1815 60436 65700 0 4.3 468.7 2.33e+05 +2024 05 06 1816 60436 65760 0 4.3 511.3 3.59e+05 +2024 05 06 1817 60436 65820 0 4.3 524.7 3.25e+05 +2024 05 06 1818 60436 65880 0 4.3 -9999.9 -1.00e+05 +2024 05 06 1819 60436 65940 3 -9999.9 -9999.9 -1.00e+05 +2024 05 06 1820 60436 66000 0 2.1 516.0 1.61e+05 +2024 05 06 1821 60436 66060 0 2.8 538.6 2.18e+05 +2024 05 06 1822 60436 66120 0 2.7 538.1 2.10e+05 +2024 05 06 1823 60436 66180 0 2.6 538.3 2.23e+05 +2024 05 06 1824 60436 66240 0 2.2 526.2 1.76e+05 +2024 05 06 1825 60436 66300 0 3.7 541.5 1.43e+05 +2024 05 06 1826 60436 66360 0 4.5 556.9 1.54e+05 +2024 05 06 1827 60436 66420 0 2.8 543.2 1.61e+05 +2024 05 06 1828 60436 66480 0 2.2 540.7 1.84e+05 +2024 05 06 1829 60436 66540 0 2.5 536.2 1.91e+05 +2024 05 06 1830 60436 66600 0 2.4 543.3 1.79e+05 +2024 05 06 1831 60436 66660 0 2.2 545.2 1.88e+05 +2024 05 06 1832 60436 66720 0 2.1 543.4 1.75e+05 +2024 05 06 1833 60436 66780 0 3.2 544.2 1.59e+05 +2024 05 06 1834 60436 66840 0 3.1 540.1 1.54e+05 +2024 05 06 1835 60436 66900 0 3.6 546.6 1.73e+05 +2024 05 06 1836 60436 66960 0 2.5 538.2 1.64e+05 +2024 05 06 1837 60436 67020 0 2.2 522.6 1.43e+05 +2024 05 06 1838 60436 67080 0 2.4 511.6 1.31e+05 +2024 05 06 1839 60436 67140 0 2.7 537.3 2.11e+05 +2024 05 06 1840 60436 67200 0 2.8 549.6 2.52e+05 +2024 05 06 1841 60436 67260 0 2.7 540.9 2.18e+05 +2024 05 06 1842 60436 67320 0 2.4 514.7 1.55e+05 +2024 05 06 1843 60436 67380 0 2.3 516.2 1.72e+05 +2024 05 06 1844 60436 67440 0 2.5 556.3 2.66e+05 +2024 05 06 1845 60436 67500 0 2.4 533.0 2.39e+05 +2024 05 06 1846 60436 67560 0 2.9 521.0 2.25e+05 +2024 05 06 1847 60436 67620 0 1.6 486.8 1.52e+05 +2024 05 06 1848 60436 67680 0 2.2 545.4 2.46e+05 +2024 05 06 1849 60436 67740 0 3.4 547.5 2.12e+05 +2024 05 06 1850 60436 67800 0 6.7 550.4 1.98e+05 +2024 05 06 1851 60436 67860 0 6.8 550.5 1.97e+05 +2024 05 06 1852 60436 67920 3 -9999.9 -9999.9 -1.00e+05 +2024 05 06 1853 60436 67980 0 2.1 538.6 1.73e+05 +2024 05 06 1854 60436 68040 0 3.2 528.4 1.77e+05 +2024 05 06 1855 60436 68100 0 2.3 503.7 1.33e+05 diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs new file mode 100644 index 0000000..34dcc8e --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs @@ -0,0 +1,31 @@ +using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using BenchmarkDotNet.Attributes; + +namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr; + +/// +/// Benchmarks for (DSCOVR). +/// +[MemoryDiagnoser(false)] +public class DscovrMagnetometerDataParserBenchmark +{ + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr.Samples.DscovrMagnetometerSample.json"; + + private string _text = string.Empty; + + [GlobalSetup] + public async Task Setup() + { + await using var stream = typeof(DscovrMagnetometerDataParserBenchmark).Assembly + .GetManifestResourceStream(ResourceName) + ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); + using var reader = new StreamReader(stream); + _text = await reader.ReadToEndAsync(); + } + + [Benchmark] + public void Parse() + { + MagnetometerDataParser.Parse(_text); + } +} diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs new file mode 100644 index 0000000..5938e01 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs @@ -0,0 +1,31 @@ +using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using BenchmarkDotNet.Attributes; + +namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr; + +/// +/// Benchmarks for (DSCOVR). +/// +[MemoryDiagnoser(false)] +public class DscovrSolarWindPlasmaDataParserBenchmark +{ + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr.Samples.DscovrSolarWindPlasmaSample.json"; + + private string _text = string.Empty; + + [GlobalSetup] + public async Task Setup() + { + await using var stream = typeof(DscovrMagnetometerDataParserBenchmark).Assembly + .GetManifestResourceStream(ResourceName) + ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); + using var reader = new StreamReader(stream); + _text = await reader.ReadToEndAsync(); + } + + [Benchmark] + public void Parse() + { + SolarWindPlasmaDataParser.Parse(_text); + } +} diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json new file mode 100644 index 0000000..2072186 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json @@ -0,0 +1,1055 @@ +[ + [ + "time_tag", + "bx_gsm", + "by_gsm", + "bz_gsm", + "lon_gsm", + "lat_gsm", + "bt" + ], + [ + "2024-05-19 17:07:00.000", + "-2.15", + "8.51", + "-2.98", + "104.17", + "-18.76", + "9.27" + ], + [ + "2024-05-19 17:08:00.000", + "-2.38", + "8.31", + "-3.24", + "105.97", + "-20.54", + "9.23" + ], + [ + "2024-05-19 17:09:00.000", + "-2.15", + "8.59", + "-2.39", + "104.03", + "-15.13", + "9.17" + ], + [ + "2024-05-19 17:10:00.000", + "-1.89", + "8.83", + "-1.79", + "102.09", + "-11.24", + "9.20" + ], + [ + "2024-05-19 17:11:00.000", + "-1.45", + "8.89", + "-1.99", + "99.27", + "-12.45", + "9.22" + ], + [ + "2024-05-19 17:12:00.000", + "-0.84", + "9.07", + "-1.86", + "95.30", + "-11.57", + "9.29" + ], + [ + "2024-05-19 17:13:00.000", + "-1.08", + "9.13", + "-1.70", + "96.74", + "-10.50", + "9.35" + ], + [ + "2024-05-19 17:14:00.000", + "-0.77", + "9.23", + "-1.21", + "94.79", + "-7.46", + "9.34" + ], + [ + "2024-05-19 17:15:00.000", + "-0.58", + "9.23", + "-0.73", + "93.59", + "-4.53", + "9.28" + ], + [ + "2024-05-19 17:16:00.000", + "-1.63", + "8.76", + "-1.84", + "100.57", + "-11.66", + "9.09" + ], + [ + "2024-05-19 17:17:00.000", + "-2.04", + "8.42", + "-2.67", + "103.58", + "-17.11", + "9.07" + ], + [ + "2024-05-19 17:18:00.000", + "-2.26", + "8.32", + "-2.78", + "105.21", + "-17.90", + "9.06" + ], + [ + "2024-05-19 17:19:00.000", + "-2.22", + "8.39", + "-2.70", + "104.83", + "-17.27", + "9.09" + ], + [ + "2024-05-19 17:20:00.000", + "-2.29", + "8.36", + "-2.70", + "105.29", + "-17.27", + "9.08" + ], + [ + "2024-05-19 17:21:00.000", + "-2.52", + "8.23", + "-2.83", + "107.03", + "-18.19", + "9.06" + ], + [ + "2024-05-19 17:22:00.000", + "-2.64", + "8.14", + "-3.06", + "107.97", + "-19.65", + "9.09" + ], + [ + "2024-05-19 17:23:00.000", + "-2.61", + "7.99", + "-3.43", + "108.09", + "-22.23", + "9.08" + ], + [ + "2024-05-19 17:24:00.000", + "-2.71", + "8.02", + "-3.30", + "108.66", + "-21.29", + "9.09" + ], + [ + "2024-05-19 17:25:00.000", + "-2.36", + "7.79", + "-4.01", + "106.87", + "-26.25", + "9.07" + ], + [ + "2024-05-19 17:26:00.000", + "-2.67", + "8.07", + "-3.33", + "108.32", + "-21.39", + "9.13" + ], + [ + "2024-05-19 17:27:00.000", + "-2.86", + "8.22", + "-2.78", + "109.16", + "-17.72", + "9.14" + ], + [ + "2024-05-19 17:28:00.000", + "-2.80", + "8.19", + "-2.78", + "108.89", + "-17.79", + "9.09" + ], + [ + "2024-05-19 17:29:00.000", + "-2.59", + "8.12", + "-3.02", + "107.72", + "-19.54", + "9.04" + ], + [ + "2024-05-19 17:30:00.000", + "-2.38", + "8.29", + "-2.59", + "106.05", + "-16.72", + "9.00" + ], + [ + "2024-05-19 17:31:00.000", + "-2.18", + "8.38", + "-2.49", + "104.56", + "-16.03", + "9.01" + ], + [ + "2024-05-19 17:32:00.000", + "-2.28", + "8.41", + "-2.49", + "105.20", + "-15.98", + "9.06" + ], + [ + "2024-05-19 17:33:00.000", + "-2.24", + "8.40", + "-2.58", + "104.91", + "-16.52", + "9.07" + ], + [ + "2024-05-19 17:34:00.000", + "-2.38", + "8.29", + "-2.78", + "105.99", + "-17.89", + "9.06" + ], + [ + "2024-05-19 17:35:00.000", + "-2.92", + "7.80", + "-4.11", + "110.53", + "-26.27", + "9.29" + ], + [ + "2024-05-19 17:36:00.000", + "-3.23", + "7.34", + "-4.78", + "113.72", + "-30.81", + "9.34" + ], + [ + "2024-05-19 17:37:00.000", + "-2.94", + "7.47", + "-4.74", + "111.48", + "-30.56", + "9.33" + ], + [ + "2024-05-19 17:38:00.000", + "-2.86", + "7.37", + "-4.89", + "111.24", + "-31.75", + "9.30" + ], + [ + "2024-05-19 17:39:00.000", + "-2.79", + "7.34", + "-4.63", + "110.79", + "-30.55", + "9.11" + ], + [ + "2024-05-19 17:40:00.000", + "-2.54", + "7.52", + "-4.01", + "108.66", + "-26.82", + "8.89" + ], + [ + "2024-05-19 17:41:00.000", + "-2.48", + "8.00", + "-2.90", + "107.19", + "-19.12", + "8.87" + ], + [ + "2024-05-19 17:42:00.000", + "-2.40", + "8.31", + "-1.97", + "106.12", + "-12.85", + "8.87" + ], + [ + "2024-05-19 17:43:00.000", + "-2.32", + "8.44", + "-1.74", + "105.38", + "-11.22", + "8.93" + ], + [ + "2024-05-19 17:44:00.000", + "-2.21", + "8.49", + "-2.02", + "104.61", + "-12.94", + "9.01" + ], + [ + "2024-05-19 17:45:00.000", + "-2.13", + "8.57", + "-1.81", + "103.93", + "-11.58", + "9.01" + ], + [ + "2024-05-19 17:46:00.000", + "-2.24", + "8.60", + "-1.57", + "104.60", + "-10.02", + "9.03" + ], + [ + "2024-05-19 17:47:00.000", + "-2.43", + "8.58", + "-1.38", + "105.78", + "-8.77", + "9.02" + ], + [ + "2024-05-19 17:48:00.000", + "-2.45", + "8.60", + "-1.15", + "105.91", + "-7.33", + "9.02" + ], + [ + "2024-05-19 17:49:00.000", + "-2.17", + "8.61", + "-1.00", + "104.16", + "-6.41", + "8.93" + ], + [ + "2024-05-19 17:50:00.000", + "-2.24", + "8.49", + "-1.49", + "104.79", + "-9.62", + "8.91" + ], + [ + "2024-05-19 17:51:00.000", + "-2.18", + "8.49", + "-1.34", + "104.38", + "-8.67", + "8.87" + ], + [ + "2024-05-19 17:52:00.000", + "-1.66", + "8.59", + "-1.21", + "100.93", + "-7.85", + "8.83" + ], + [ + "2024-05-19 17:53:00.000", + "-2.09", + "8.57", + "-1.04", + "103.70", + "-6.71", + "8.89" + ], + [ + "2024-05-19 17:54:00.000", + "-2.00", + "8.63", + "-1.29", + "103.03", + "-8.31", + "8.96" + ], + [ + "2024-05-19 17:55:00.000", + "-1.97", + "8.67", + "-1.47", + "102.78", + "-9.41", + "9.02" + ], + [ + "2024-05-19 17:56:00.000", + "-1.92", + "8.69", + "-1.82", + "102.44", + "-11.55", + "9.09" + ], + [ + "2024-05-19 17:57:00.000", + "-1.98", + "8.71", + "-1.70", + "102.81", + "-10.77", + "9.10" + ], + [ + "2024-05-19 17:58:00.000", + "-2.04", + "8.72", + "-1.68", + "103.18", + "-10.64", + "9.11" + ], + [ + "2024-05-19 17:59:00.000", + "-1.80", + "8.74", + "-1.69", + "101.67", + "-10.75", + "9.08" + ], + [ + "2024-05-19 18:00:00.000", + "-1.80", + "8.74", + "-1.71", + "101.64", + "-10.82", + "9.09" + ], + [ + "2024-05-19 18:01:00.000", + "-1.63", + "8.72", + "-1.89", + "100.62", + "-12.03", + "9.07" + ], + [ + "2024-05-19 18:02:00.000", + "-1.86", + "8.73", + "-1.66", + "102.01", + "-10.53", + "9.08" + ], + [ + "2024-05-19 18:03:00.000", + "-1.89", + "8.73", + "-1.55", + "102.20", + "-9.88", + "9.06" + ], + [ + "2024-05-19 18:04:00.000", + "-2.13", + "8.70", + "-1.25", + "103.75", + "-7.97", + "9.05" + ], + [ + "2024-05-19 18:05:00.000", + "-2.19", + "8.67", + "-1.23", + "104.19", + "-7.81", + "9.03" + ], + [ + "2024-05-19 18:06:00.000", + "-2.33", + "8.60", + "-1.30", + "105.15", + "-8.28", + "9.00" + ], + [ + "2024-05-19 18:07:00.000", + "-2.56", + "8.58", + "-1.40", + "106.61", + "-8.86", + "9.06" + ], + [ + "2024-05-19 18:08:00.000", + "-2.63", + "8.62", + "-1.51", + "106.96", + "-9.54", + "9.13" + ], + [ + "2024-05-19 18:09:00.000", + "-2.86", + "8.55", + "-1.78", + "108.48", + "-11.16", + "9.19" + ], + [ + "2024-05-19 18:10:00.000", + "-2.50", + "8.70", + "-1.37", + "106.04", + "-8.59", + "9.16" + ], + [ + "2024-05-19 18:11:00.000", + "-2.43", + "8.76", + "-0.88", + "105.51", + "-5.55", + "9.14" + ], + [ + "2024-05-19 18:12:00.000", + "-2.13", + "8.82", + "-0.96", + "103.58", + "-6.02", + "9.12" + ], + [ + "2024-05-19 18:13:00.000", + "-2.09", + "8.85", + "-0.62", + "103.31", + "-3.89", + "9.11" + ], + [ + "2024-05-19 18:14:00.000", + "-2.29", + "8.78", + "-0.99", + "104.62", + "-6.21", + "9.13" + ], + [ + "2024-05-19 18:15:00.000", + "-2.77", + "8.53", + "-1.57", + "107.96", + "-9.93", + "9.11" + ], + [ + "2024-05-19 18:16:00.000", + "-2.74", + "8.55", + "-1.45", + "107.78", + "-9.16", + "9.09" + ], + [ + "2024-05-19 18:17:00.000", + "-2.76", + "8.21", + "-1.54", + "108.56", + "-10.07", + "8.80" + ], + [ + "2024-05-19 18:18:00.000", + "-3.25", + "8.05", + "-1.54", + "111.97", + "-10.08", + "8.81" + ], + [ + "2024-05-19 18:19:00.000", + "-3.05", + "8.24", + "-1.56", + "110.34", + "-10.09", + "8.92" + ], + [ + "2024-05-19 18:20:00.000", + "-2.58", + "8.35", + "-1.08", + "107.21", + "-7.07", + "8.80" + ], + [ + "2024-05-19 18:21:00.000", + "-1.79", + "8.59", + "0.20", + "101.78", + "1.32", + "8.77" + ], + [ + "2024-05-19 18:22:00.000", + "-0.80", + "7.98", + "1.27", + "95.74", + "8.97", + "8.12" + ], + [ + "2024-05-19 18:23:00.000", + "-0.79", + "7.96", + "1.71", + "95.67", + "12.08", + "8.18" + ], + [ + "2024-05-19 18:24:00.000", + "-0.75", + "7.81", + "2.16", + "95.51", + "15.41", + "8.14" + ], + [ + "2024-05-19 18:25:00.000", + "-0.40", + "7.94", + "1.46", + "92.91", + "10.38", + "8.08" + ], + [ + "2024-05-19 18:26:00.000", + "0.12", + "8.02", + "1.03", + "89.11", + "7.32", + "8.09" + ], + [ + "2024-05-19 18:27:00.000", + "0.10", + "7.88", + "1.65", + "89.30", + "11.83", + "8.05" + ], + [ + "2024-05-19 18:28:00.000", + "0.61", + "7.76", + "2.01", + "85.50", + "14.51", + "8.04" + ], + [ + "2024-05-19 18:29:00.000", + "0.68", + "7.59", + "2.56", + "84.88", + "18.56", + "8.04" + ], + [ + "2024-05-19 18:30:00.000", + "0.67", + "7.22", + "3.02", + "84.68", + "22.64", + "7.85" + ], + [ + "2024-05-19 18:31:00.000", + "0.53", + "7.18", + "2.77", + "85.80", + "21.03", + "7.71" + ], + [ + "2024-05-19 18:32:00.000", + "0.42", + "7.21", + "2.70", + "86.65", + "20.50", + "7.72" + ], + [ + "2024-05-19 18:33:00.000", + "0.55", + "7.17", + "2.72", + "85.63", + "20.69", + "7.69" + ], + [ + "2024-05-19 18:34:00.000", + "0.68", + "7.11", + "2.70", + "84.52", + "20.70", + "7.63" + ], + [ + "2024-05-19 18:35:00.000", + "0.58", + "7.07", + "2.74", + "85.28", + "21.15", + "7.60" + ], + [ + "2024-05-19 18:36:00.000", + "0.74", + "6.90", + "3.18", + "83.85", + "24.64", + "7.63" + ], + [ + "2024-05-19 18:37:00.000", + "0.88", + "6.83", + "3.25", + "82.64", + "25.26", + "7.62" + ], + [ + "2024-05-19 18:38:00.000", + "-0.02", + "7.30", + "2.40", + "90.13", + "18.24", + "7.68" + ], + [ + "2024-05-19 18:39:00.000", + "-0.12", + "7.57", + "1.81", + "90.93", + "13.47", + "7.78" + ], + [ + "2024-05-19 18:41:00.000", + "0.56", + "7.00", + "2.52", + "85.46", + "19.77", + "7.47" + ], + [ + "2024-05-19 18:42:00.000", + "0.97", + "6.54", + "3.10", + "81.60", + "25.16", + "7.30" + ], + [ + "2024-05-19 18:43:00.000", + "1.39", + "6.21", + "3.45", + "77.36", + "28.45", + "7.24" + ], + [ + "2024-05-19 18:44:00.000", + "1.40", + "6.24", + "3.63", + "77.35", + "29.58", + "7.36" + ], + [ + "2024-05-19 18:45:00.000", + "1.29", + "6.33", + "3.58", + "78.49", + "29.01", + "7.39" + ], + [ + "2024-05-19 18:46:00.000", + "1.64", + "6.05", + "4.04", + "74.87", + "32.82", + "7.46" + ], + [ + "2024-05-19 18:47:00.000", + "1.66", + "5.92", + "4.15", + "74.35", + "34.03", + "7.42" + ], + [ + "2024-05-19 18:48:00.000", + "1.62", + "5.93", + "4.18", + "74.74", + "34.25", + "7.43" + ], + [ + "2024-05-19 18:49:00.000", + "1.58", + "5.94", + "4.20", + "75.13", + "34.37", + "7.45" + ], + [ + "2024-05-19 18:50:00.000", + "1.68", + "5.75", + "4.41", + "73.70", + "36.39", + "7.44" + ], + [ + "2024-05-19 18:51:00.000", + "1.88", + "5.54", + "4.55", + "71.27", + "37.88", + "7.41" + ], + [ + "2024-05-19 18:52:00.000", + "1.91", + "5.40", + "4.66", + "70.51", + "39.16", + "7.38" + ], + [ + "2024-05-19 18:53:00.000", + "1.81", + "5.39", + "4.68", + "71.45", + "39.48", + "7.36" + ], + [ + "2024-05-19 18:54:00.000", + "1.94", + "5.34", + "4.70", + "70.00", + "39.59", + "7.37" + ], + [ + "2024-05-19 18:55:00.000", + "2.09", + "5.29", + "4.75", + "68.42", + "39.88", + "7.41" + ], + [ + "2024-05-19 18:56:00.000", + "1.52", + "5.95", + "4.34", + "75.62", + "35.29", + "7.52" + ], + [ + "2024-05-19 18:57:00.000", + "1.63", + "6.78", + "2.64", + "76.52", + "20.73", + "7.46" + ], + [ + "2024-05-19 18:58:00.000", + "1.37", + "6.79", + "2.76", + "78.55", + "21.76", + "7.46" + ], + [ + "2024-05-19 18:59:00.000", + "1.85", + "5.73", + "4.07", + "72.10", + "34.04", + "7.26" + ], + [ + "2024-05-19 19:00:00.000", + "2.22", + "5.14", + "5.02", + "66.60", + "41.92", + "7.52" + ], + [ + "2024-05-19 19:01:00.000", + "0.00", + "7.63", + "1.83", + "90.00", + "13.52", + "7.84" + ], + [ + "2024-05-19 19:02:00.000", + "0.49", + "5.12", + "4.04", + "84.53", + "38.13", + "6.55" + ], + [ + "2024-05-19 19:03:00.000", + "1.03", + "4.41", + "5.01", + "76.82", + "47.86", + "6.75" + ] +] \ No newline at end of file diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json new file mode 100644 index 0000000..f9a8971 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json @@ -0,0 +1,710 @@ +[ + [ + "time_tag", + "density", + "speed", + "temperature" + ], + [ + "2024-05-20 05:51:00.000", + "2.18", + "393.9", + "36967" + ], + [ + "2024-05-20 05:52:00.000", + "2.60", + "397.4", + "44618" + ], + [ + "2024-05-20 05:53:00.000", + "2.93", + "401.7", + "50222" + ], + [ + "2024-05-20 05:54:00.000", + "2.84", + "402.1", + "49766" + ], + [ + "2024-05-20 05:55:00.000", + "2.96", + "403.9", + "54639" + ], + [ + "2024-05-20 05:56:00.000", + "3.14", + "403.6", + "52343" + ], + [ + "2024-05-20 05:57:00.000", + "2.85", + "398.1", + "42124" + ], + [ + "2024-05-20 05:58:00.000", + "3.53", + "413.5", + "79750" + ], + [ + "2024-05-20 05:59:00.000", + "4.04", + "418.4", + "94403" + ], + [ + "2024-05-20 06:00:00.000", + "3.59", + "410.5", + "70257" + ], + [ + "2024-05-20 06:01:00.000", + "1.50", + "384.0", + "19719" + ], + [ + "2024-05-20 06:02:00.000", + "3.66", + "411.4", + "72816" + ], + [ + "2024-05-20 06:03:00.000", + "4.60", + "415.7", + "101427" + ], + [ + "2024-05-20 06:04:00.000", + "3.53", + "408.2", + "68041" + ], + [ + "2024-05-20 06:05:00.000", + "2.09", + "390.1", + "30888" + ], + [ + "2024-05-20 06:06:00.000", + "3.72", + "407.5", + "80549" + ], + [ + "2024-05-20 06:07:00.000", + "4.15", + "409.8", + "81947" + ], + [ + "2024-05-20 06:08:00.000", + "3.37", + "401.8", + "59059" + ], + [ + "2024-05-20 06:09:00.000", + "3.23", + "397.8", + "51255" + ], + [ + "2024-05-20 06:10:00.000", + "3.57", + "401.8", + "63432" + ], + [ + "2024-05-20 06:11:00.000", + "3.35", + "403.1", + "66628" + ], + [ + "2024-05-20 06:12:00.000", + "3.00", + "400.6", + "60324" + ], + [ + "2024-05-20 06:13:00.000", + "3.11", + "405.1", + "71978" + ], + [ + "2024-05-20 06:14:00.000", + "2.73", + "400.8", + "67951" + ], + [ + "2024-05-20 06:15:00.000", + "3.49", + "408.4", + "104656" + ], + [ + "2024-05-20 06:16:00.000", + "3.42", + "407.5", + "82744" + ], + [ + "2024-05-20 06:17:00.000", + "2.77", + "397.2", + "52336" + ], + [ + "2024-05-20 06:18:00.000", + "2.81", + "398.7", + "70191" + ], + [ + "2024-05-20 06:19:00.000", + "3.01", + "407.5", + "90879" + ], + [ + "2024-05-20 06:20:00.000", + "3.10", + "407.9", + "116975" + ], + [ + "2024-05-20 06:21:00.000", + "1.45", + "383.5", + "77142" + ], + [ + "2024-05-20 06:22:00.000", + "0.81", + "371.2", + "65281" + ], + [ + "2024-05-20 06:23:00.000", + "0.73", + "368.9", + "64933" + ], + [ + "2024-05-20 06:24:00.000", + "0.60", + "362.8", + "80676" + ], + [ + "2024-05-20 06:25:00.000", + "0.60", + "362.8", + "80676" + ], + [ + "2024-05-20 06:26:00.000", + "0.59", + "361.2", + "50890" + ], + [ + "2024-05-20 06:27:00.000", + "0.58", + "357.7", + "50132" + ], + [ + "2024-05-20 06:28:00.000", + "0.66", + "355.8", + "55686" + ], + [ + "2024-05-20 06:29:00.000", + "0.81", + "362.3", + "76460" + ], + [ + "2024-05-20 06:30:00.000", + "0.67", + "361.9", + "96422" + ], + [ + "2024-05-20 06:31:00.000", + "0.60", + "364.8", + "89577" + ], + [ + "2024-05-20 06:32:00.000", + "0.82", + "360.3", + "52768" + ], + [ + "2024-05-20 06:33:00.000", + "0.83", + "356.3", + "27929" + ], + [ + "2024-05-20 06:34:00.000", + "0.85", + "355.4", + "34516" + ], + [ + "2024-05-20 06:35:00.000", + "0.73", + "359.0", + "27452" + ], + [ + "2024-05-20 06:36:00.000", + "0.55", + "345.7", + "34811" + ], + [ + "2024-05-20 06:37:00.000", + "0.66", + "353.0", + "35145" + ], + [ + "2024-05-20 06:38:00.000", + "0.80", + "362.2", + "81131" + ], + [ + "2024-05-20 06:39:00.000", + "0.73", + "364.4", + "102429" + ], + [ + "2024-05-20 06:40:00.000", + "0.59", + "359.5", + "77349" + ], + [ + "2024-05-20 06:41:00.000", + "0.70", + "359.2", + "56324" + ], + [ + "2024-05-20 06:42:00.000", + "0.78", + "359.4", + "42705" + ], + [ + "2024-05-20 06:43:00.000", + "0.79", + "359.6", + "39952" + ], + [ + "2024-05-20 06:44:00.000", + "0.82", + "360.5", + "55489" + ], + [ + "2024-05-20 06:45:00.000", + "0.73", + "355.2", + "52068" + ], + [ + "2024-05-20 06:46:00.000", + "0.86", + "359.1", + "37104" + ], + [ + "2024-05-20 06:47:00.000", + "0.82", + "360.3", + "28677" + ], + [ + "2024-05-20 06:48:00.000", + "0.87", + "355.8", + "41992" + ], + [ + "2024-05-20 06:49:00.000", + "0.81", + "350.6", + "28254" + ], + [ + "2024-05-20 06:50:00.000", + "0.97", + "359.2", + "43745" + ], + [ + "2024-05-20 06:51:00.000", + "0.97", + "359.4", + "34669" + ], + [ + "2024-05-20 06:52:00.000", + "0.88", + "360.0", + "46481" + ], + [ + "2024-05-20 06:53:00.000", + "0.99", + "350.0", + "44946" + ], + [ + "2024-05-20 06:54:00.000", + "0.88", + "353.5", + "42201" + ], + [ + "2024-05-20 06:55:00.000", + "0.59", + "357.3", + "32648" + ], + [ + "2024-05-20 06:56:00.000", + "0.47", + "358.2", + "28213" + ], + [ + "2024-05-20 06:57:00.000", + "0.68", + "360.6", + "85443" + ], + [ + "2024-05-20 06:58:00.000", + "0.73", + "361.9", + "77703" + ], + [ + "2024-05-20 06:59:00.000", + "0.68", + "366.0", + "77807" + ], + [ + "2024-05-20 07:00:00.000", + "0.56", + "369.1", + "85208" + ], + [ + "2024-05-20 07:01:00.000", + "0.65", + "368.5", + "77965" + ], + [ + "2024-05-20 07:02:00.000", + "0.66", + "370.6", + "89680" + ], + [ + "2024-05-20 07:03:00.000", + "0.64", + "364.3", + "81903" + ], + [ + "2024-05-20 07:04:00.000", + "0.75", + "363.1", + "68216" + ], + [ + "2024-05-20 07:05:00.000", + "0.75", + "363.8", + "39073" + ], + [ + "2024-05-20 07:07:00.000", + "0.70", + "356.7", + "61982" + ], + [ + "2024-05-20 07:08:00.000", + "0.86", + "358.0", + "65453" + ], + [ + "2024-05-20 07:09:00.000", + "0.86", + "355.4", + "32897" + ], + [ + "2024-05-20 07:10:00.000", + "0.86", + "354.8", + "24625" + ], + [ + "2024-05-20 07:11:00.000", + "0.78", + "346.6", + "28705" + ], + [ + "2024-05-20 07:12:00.000", + "0.86", + "349.2", + "35810" + ], + [ + "2024-05-20 07:13:00.000", + "0.88", + "355.6", + "44336" + ], + [ + "2024-05-20 07:14:00.000", + "0.84", + "358.8", + "55106" + ], + [ + "2024-05-20 07:15:00.000", + "0.80", + "360.0", + "68165" + ], + [ + "2024-05-20 07:16:00.000", + "0.72", + "359.8", + "62071" + ], + [ + "2024-05-20 07:17:00.000", + "0.68", + "353.5", + "34599" + ], + [ + "2024-05-20 07:18:00.000", + "0.70", + "356.7", + "32300" + ], + [ + "2024-05-20 07:19:00.000", + "0.78", + "355.7", + "37786" + ], + [ + "2024-05-20 07:20:00.000", + "0.50", + "353.9", + "14791" + ], + [ + "2024-05-20 07:21:00.000", + "0.45", + "348.3", + "22851" + ], + [ + "2024-05-20 07:22:00.000", + "1.00", + "352.2", + "47357" + ], + [ + "2024-05-20 07:23:00.000", + "0.79", + "356.5", + "60315" + ], + [ + "2024-05-20 07:24:00.000", + "0.82", + "356.8", + "52856" + ], + [ + "2024-05-20 07:25:00.000", + "0.91", + "355.8", + "46918" + ], + [ + "2024-05-20 07:26:00.000", + "0.84", + "361.9", + "61155" + ], + [ + "2024-05-20 07:27:00.000", + "0.73", + "365.1", + "51227" + ], + [ + "2024-05-20 07:28:00.000", + "0.66", + "364.0", + "66302" + ], + [ + "2024-05-20 07:29:00.000", + "0.64", + "363.0", + "81527" + ], + [ + "2024-05-20 07:30:00.000", + "0.60", + "360.7", + "78187" + ], + [ + "2024-05-20 07:31:00.000", + "0.61", + "359.8", + "67269" + ], + [ + "2024-05-20 07:32:00.000", + "0.62", + "359.4", + "68661" + ], + [ + "2024-05-20 07:33:00.000", + "0.65", + "360.9", + "109078" + ], + [ + "2024-05-20 07:34:00.000", + "0.64", + "362.4", + "128036" + ], + [ + "2024-05-20 07:35:00.000", + "0.45", + "369.5", + "137350" + ], + [ + "2024-05-20 07:36:00.000", + "0.41", + "359.2", + "59948" + ], + [ + "2024-05-20 07:37:00.000", + "0.41", + "370.3", + "144742" + ], + [ + "2024-05-20 07:38:00.000", + "0.51", + "363.8", + "109968" + ], + [ + "2024-05-20 07:39:00.000", + "0.51", + "363.2", + "69724" + ], + [ + "2024-05-20 07:40:00.000", + "0.52", + "364.3", + "114640" + ], + [ + "2024-05-20 07:41:00.000", + "0.41", + "366.1", + "151774" + ], + [ + "2024-05-20 07:42:00.000", + "0.34", + "368.5", + "152852" + ], + [ + "2024-05-20 07:43:00.000", + "0.36", + "355.7", + "72072" + ], + [ + "2024-05-20 07:44:00.000", + "0.26", + "351.2", + "23548" + ], + [ + "2024-05-20 07:45:00.000", + "0.25", + "358.0", + "78363" + ], + [ + "2024-05-20 07:46:00.000", + "0.30", + "364.6", + "119952" + ], + [ + "2024-05-20 07:47:00.000", + "0.29", + "362.7", + "105402" + ], + [ + "2024-05-20 07:48:00.000", + "0.27", + "358.1", + "83667" + ] +] \ No newline at end of file diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Program.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Program.cs new file mode 100644 index 0000000..b797c92 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Program.cs @@ -0,0 +1,9 @@ +using BenchmarkDotNet.Running; + +namespace AuroraScienceHub.Integrations.Benchmarks; + +public class Program +{ + public static void Main(string[] args) + => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); +} diff --git a/docs/logo/Fw_black.png b/docs/logo/Fw_black.png new file mode 100644 index 0000000000000000000000000000000000000000..e30fb2cb0de5707a11309da6f5023855bb6498ba GIT binary patch literal 124625 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 IM6N<$f-Nps4FCWD literal 0 HcmV?d00001 diff --git a/docs/logo/Fw_icon.png b/docs/logo/Fw_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e76ceaeee0ca1ec4b453d1932b27dc55a872d5d GIT binary patch literal 9647 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 literal 0 HcmV?d00001 diff --git a/docs/logo/Fw_white.png b/docs/logo/Fw_white.png new file mode 100644 index 0000000000000000000000000000000000000000..8811c2581c7d1e40ec64110ef4d6c505b4c14edb GIT binary patch literal 120824 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 z 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 AD*ylh literal 0 HcmV?d00001 diff --git a/global.json b/global.json new file mode 100644 index 0000000..895d51b --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "10.0.100", + "rollForward": "patch", + "allowPrerelease": false + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..385cbce --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "madr": "^3.0.0" + } +} diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..ac2b089 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,26 @@ + + + + + + True + + + + Aleksei Ermilov;Alexander Nikolaev;Aurora Science Hub + README.md + https://github.com/Aurora-Science-Hub/Integrations + https://github.com/Aurora-Science-Hub/Integrations.git + git + MIT + true + Fw_icon.png + Copyright 2024-$([System.DateTime]::Now.ToString(yyyy)) Aurora Science Hub + + + + + + + + diff --git a/src/ExternalResources/Ace/AceClient.cs b/src/ExternalResources/Ace/AceClient.cs new file mode 100644 index 0000000..d86181e --- /dev/null +++ b/src/ExternalResources/Ace/AceClient.cs @@ -0,0 +1,40 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Extensions; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace; + +internal sealed class AceClient : IAceClient +{ + private readonly HttpClient _httpClient; + private readonly Uri _baseUrl; + + public AceClient( + HttpClient httpClient, + IOptions options) + { + _httpClient = httpClient; + _baseUrl = options.Value.RequiredServerUrl; + } + + public async Task> GetMagnetometerDataAsync(CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, "text/ace-magnetometer.txt"); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + + return MagnetometerDataParser.Parse(text); + } + + public async Task> GetSwepamDataAsync(CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, "text/ace-swepam.txt"); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + + return SolarWindPlasmaDataParser.Parse(text); + } +} diff --git a/src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs b/src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs new file mode 100644 index 0000000..25e5931 --- /dev/null +++ b/src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs @@ -0,0 +1,67 @@ +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Extensions; + +// ACE Magnetometer data example: +// # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +// # Missing data values: -999.9 +// # Modified Seconds +// # UT Date Time Julian of the ---------------- GSM Coordinates --------------- +// # YR MO DA HHMM Day Day S Bx By Bz Bt Lat. Long. +// #------------------------------------------------------------------------------------ +// 2024 05 05 0846 60435 31560 0 -0.7 -0.8 -1.9 2.2 -60.5 225.8 +internal static class MagnetometerDataParser +{ + private const string MissingDataValue = "-999.9"; + + public static IReadOnlyList Parse(string text) + { + var records = new List(); + var lines = text.SplitLines(); + Span fieldsRange = stackalloc Range[32]; + + foreach (var line in lines) + { + var trimmedLine = line.Line.Trim(); + if (trimmedLine.Length == 0 || trimmedLine[0] == '#') + { + continue; + } + var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + // check if line contains data + if (rangesCount != 13 || !trimmedLine[fieldsRange[0]].IsParsableAsInt()) + { + continue; + } + + var record = new MagnetometerRecord + ( + DateTime: new DateTime( + year: trimmedLine[fieldsRange[0]].ParseIntInvariant(), + month: trimmedLine[fieldsRange[1]].ParseIntInvariant(), + day: trimmedLine[fieldsRange[2]].ParseIntInvariant(), + hour: trimmedLine[fieldsRange[3]][..2].ParseIntInvariant(), + minute: trimmedLine[fieldsRange[3]][2..].ParseIntInvariant(), + second: 0, + DateTimeKind.Utc), + Status: trimmedLine[fieldsRange[6]].ParseIntInvariant(), + Bx: GetFloatOrNull(trimmedLine[fieldsRange[7]]), + By: GetFloatOrNull(trimmedLine[fieldsRange[8]]), + Bz: GetFloatOrNull(trimmedLine[fieldsRange[9]]), + Bt: GetFloatOrNull(trimmedLine[fieldsRange[10]]), + Latitude: GetFloatOrNull(trimmedLine[fieldsRange[11]]), + Longitude: GetFloatOrNull(trimmedLine[fieldsRange[12]]) + ); + records.Add(record); + } + + return records; + } + + private static float? GetFloatOrNull(ReadOnlySpan value) + => value.SequenceEqual(MissingDataValue) + ? null + : value.ParseFloatInvariant(); +} diff --git a/src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs b/src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs new file mode 100644 index 0000000..bd9ec45 --- /dev/null +++ b/src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs @@ -0,0 +1,70 @@ +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Extensions; + +// # 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma +// # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +// # Missing data values: Density and Speed = -9999.9, Temp. = -1.00e+05 +// # Modified Seconds ------------- Solar Wind ----------- +// # UT Date Time Julian of the Proton Bulk Ion +// # YR MO DA HHMM Day Day S Density Speed Temperature +// #------------------------------------------------------------------------- +// 2024 05 06 1657 60436 61020 1 4.9 475.0 2.38e+05 +internal static class SolarWindPlasmaDataParser +{ + private const string MissingDataValue = "-9999.9"; + private const string MissingTemperatureValue = "-1.00e+05"; + + public static IReadOnlyList Parse(string text) + { + var records = new List(); + var lines = text.SplitLines(); + Span fieldsRange = stackalloc Range[32]; + + foreach (var line in lines) + { + var trimmedLine = line.Line.Trim(); + if (trimmedLine.Length == 0 || trimmedLine[0] == '#') + { + continue; + } + var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + // check if line contains data + if (rangesCount != 10 || !trimmedLine[fieldsRange[0]].IsParsableAsInt()) + { + continue; + } + + var record = new SolarWindPlasmaRecord + ( + DateTime: new DateTime( + year: trimmedLine[fieldsRange[0]].ParseIntInvariant(), + month: trimmedLine[fieldsRange[1]].ParseIntInvariant(), + day: trimmedLine[fieldsRange[2]].ParseIntInvariant(), + hour: trimmedLine[fieldsRange[3]][..2].ParseIntInvariant(), + minute: trimmedLine[fieldsRange[3]][2..].ParseIntInvariant(), + second: 0, + DateTimeKind.Utc), + Status: trimmedLine[fieldsRange[6]].ParseIntInvariant(), + ProtonDensity: GetFloatOrNull(trimmedLine[fieldsRange[7]]), + BulkSpeed: GetFloatOrNull(trimmedLine[fieldsRange[8]]), + IonTemperature: GetTemperatureOrNull(trimmedLine[fieldsRange[9]]) + ); + records.Add(record); + } + + return records; + } + + private static float? GetFloatOrNull(ReadOnlySpan value) + => value.SequenceEqual(MissingDataValue) + ? null + : value.ParseFloatInvariant(); + + private static float? GetTemperatureOrNull(ReadOnlySpan value) + => value.SequenceEqual(MissingTemperatureValue) + ? null + : value.ParseFloatInvariant(); +} diff --git a/src/ExternalResources/Ace/IAceClient.cs b/src/ExternalResources/Ace/IAceClient.cs new file mode 100644 index 0000000..c187464 --- /dev/null +++ b/src/ExternalResources/Ace/IAceClient.cs @@ -0,0 +1,19 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace; + +/// +/// ACE Spacecraft client +/// +public interface IAceClient +{ + /// + /// Get ACE Magnetometer data + /// + Task> GetMagnetometerDataAsync(CancellationToken cancellationToken); + + /// + /// Get ACE Solar Wind Electron Proton Alpha Monitor data + /// + Task> GetSwepamDataAsync(CancellationToken cancellationToken); +} diff --git a/src/ExternalResources/Ace/Responses/MagnetometerRecord.cs b/src/ExternalResources/Ace/Responses/MagnetometerRecord.cs new file mode 100644 index 0000000..d376c3b --- /dev/null +++ b/src/ExternalResources/Ace/Responses/MagnetometerRecord.cs @@ -0,0 +1,22 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; + +/// +/// 1-minute averaged Real-time Interplanetary Magnetic Field Values +/// +/// Date and time of record (UTC) +/// Data Status. 0 = nominal data 1 to 8 = bad data record 9 = no data +/// IMF GSM x-component +/// IMF GSM y-component +/// IMF GSM z-component +/// IMF module +/// Spacecraft latitude +/// Spacecraft longitude +public record MagnetometerRecord( + DateTime DateTime, + int Status, + float? Bx, + float? By, + float? Bz, + float? Bt, + float? Latitude, + float? Longitude); diff --git a/src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs b/src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs new file mode 100644 index 0000000..9b68df1 --- /dev/null +++ b/src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs @@ -0,0 +1,17 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; + +/// +/// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma +/// +/// Date and time of record (UTC) +/// Data Status. 0 = nominal data 1 to 8 = bad data record 9 = no data +/// Solar Wind proton density +/// Solar Wind plasma speed +/// Solar Wind Ion Temp +public record SolarWindPlasmaRecord( + DateTime DateTime, + int Status, + float? ProtonDensity, + float? BulkSpeed, + float? IonTemperature +); diff --git a/src/ExternalResources/Dscovr/DscovrClient.cs b/src/ExternalResources/Dscovr/DscovrClient.cs new file mode 100644 index 0000000..2742057 --- /dev/null +++ b/src/ExternalResources/Dscovr/DscovrClient.cs @@ -0,0 +1,72 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Extensions; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr; + +internal sealed class DscovrClient : IDscovrClient +{ + private readonly HttpClient _httpClient; + private readonly Uri _baseUrl; + + public DscovrClient( + HttpClient httpClient, + IOptions options) + { + _httpClient = httpClient; + _baseUrl = options.Value.RequiredServerUrl; + } + + public async Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-2-hour.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-1-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-3-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-7-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-2-hour.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-1-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-3-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-7-day.json", cancellationToken) + .ConfigureAwait(false); + + private async Task> GetMagnetometerDataAsync(string relativeUri, CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, relativeUri); + var response = await _httpClient.GetAsync(url, cancellationToken); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken); + + return MagnetometerDataParser.Parse(text); + } + + private async Task> GetSolarWindPlasmaDataAsync(string relativeUri, CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, relativeUri); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + + return SolarWindPlasmaDataParser.Parse(text); + } +} diff --git a/src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs b/src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs new file mode 100644 index 0000000..01fded7 --- /dev/null +++ b/src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs @@ -0,0 +1,90 @@ +using System.Text.Json; +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Extensions; + +// DSCOVR Magnetometer data example: +// [ +// [ +// "time_tag", +// "bx_gsm", +// "by_gsm", +// "bz_gsm", +// "lon_gsm", +// "lat_gsm", +// "bt" +// ], +// [ +// "2024-05-19 16:50:00.000", +// "-2.25", +// "8.71", +// "-1.79", +// "104.50", +// "-11.25", +// "9.17" +// ] +// ] + +// TODO Write more memory allocations optimized parser +internal static class MagnetometerDataParser +{ + private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; + + public static IReadOnlyList Parse(string text) + { + using var jsonDoc = JsonDocument.Parse(text); + var rootElement = jsonDoc.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) + { + return Array.Empty(); + } + + var fieldNames = rootElement[0]; + var magnetometerRecords = new List(arrayLength); + + var timeTagIndex = GetIndex(fieldNames, "time_tag"); + var bxGsmIndex = GetIndex(fieldNames, "bx_gsm"); + var byGsmIndex = GetIndex(fieldNames, "by_gsm"); + var bzGsmIndex = GetIndex(fieldNames, "bz_gsm"); + var btIndex = GetIndex(fieldNames, "bt"); + var latGsmIndex = GetIndex(fieldNames, "lat_gsm"); + var lonGsmIndex = GetIndex(fieldNames, "lon_gsm"); + + foreach (var record in rootElement.EnumerateArray().Skip(1)) + { + magnetometerRecords.Add(new MagnetometerRecord( + DateTime: DateTime.ParseExact( + record[timeTagIndex].GetString().Required(), DateTimeFormat, + provider: null, + style: System.Globalization.DateTimeStyles.AssumeUniversal | + System.Globalization.DateTimeStyles.AdjustToUniversal), + Bx: record[bxGsmIndex].GetString()?.ParseFloatInvariant(), + By: record[byGsmIndex].GetString()?.ParseFloatInvariant(), + Bz: record[bzGsmIndex].GetString()?.ParseFloatInvariant(), + Bt: record[btIndex].GetString()?.ParseFloatInvariant(), + Latitude: record[latGsmIndex].GetString()?.ParseFloatInvariant(), + Longitude: record[lonGsmIndex].GetString()?.ParseFloatInvariant() + )); + } + + return magnetometerRecords; + } + + private static int GetIndex(JsonElement fieldNames, string fieldName) + { + var index = 0; + foreach (var name in fieldNames.EnumerateArray()) + { + if (string.Equals(name.GetString(), fieldName, StringComparison.OrdinalIgnoreCase)) + { + return index; + } + index++; + } + + throw new InvalidOperationException($"Field '{fieldName}' not found."); + } +} diff --git a/src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs b/src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs new file mode 100644 index 0000000..15511f4 --- /dev/null +++ b/src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs @@ -0,0 +1,84 @@ +using System.Text.Json; +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Extensions; + +// DSCOVR Solar wind plasma data example: +// [ +// [ +// "time_tag", +// "density", +// "speed", +// "temperature" +// ], +// [ +// "2024-05-20 05:51:00.000", +// "2.18", +// "393.9", +// "36967" +// ], +// [ +// "2024-05-20 05:52:00.000", +// "2.60", +// "397.4", +// "44618" +// ] +// ] + +// TODO Write more memory allocations optimized parser +internal static class SolarWindPlasmaDataParser +{ + private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; + + public static IReadOnlyList Parse(string text) + { + using var jsonDoc = JsonDocument.Parse(text); + var rootElement = jsonDoc.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) + { + return Array.Empty(); + } + + var fieldNames = rootElement[0]; + var solarWindPlasmaRecords = new List(arrayLength); + + var timeTagIndex = GetIndex(fieldNames, "time_tag"); + var densityIndex = GetIndex(fieldNames, "density"); + var speedIndex = GetIndex(fieldNames, "speed"); + var temperatureIndex = GetIndex(fieldNames, "temperature"); + + foreach (var record in rootElement.EnumerateArray().Skip(1)) + { + solarWindPlasmaRecords.Add(new SolarWindPlasmaRecord( + DateTime: DateTime.ParseExact( + record[timeTagIndex].GetString().Required(), DateTimeFormat, + provider: null, + style: System.Globalization.DateTimeStyles.AssumeUniversal | + System.Globalization.DateTimeStyles.AdjustToUniversal), + ProtonDensity: record[densityIndex].GetString()?.ParseFloatInvariant(), + BulkSpeed: record[speedIndex].GetString()?.ParseFloatInvariant(), + IonTemperature: record[temperatureIndex].GetString()?.ParseFloatInvariant() + )); + } + + return solarWindPlasmaRecords; + } + + private static int GetIndex(JsonElement fieldNames, string fieldName) + { + var index = 0; + foreach (var name in fieldNames.EnumerateArray()) + { + if (string.Equals(name.GetString(), fieldName, StringComparison.OrdinalIgnoreCase)) + { + return index; + } + index++; + } + + throw new InvalidOperationException($"Field '{fieldName}' not found."); + } +} diff --git a/src/ExternalResources/Dscovr/IDscovrClient.cs b/src/ExternalResources/Dscovr/IDscovrClient.cs new file mode 100644 index 0000000..0abcaef --- /dev/null +++ b/src/ExternalResources/Dscovr/IDscovrClient.cs @@ -0,0 +1,49 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr; + +/// +/// DSCOVR Spacecraft client +/// +public interface IDscovrClient +{ + /// + /// Get DSCOVR Magnetometer data (2 hours) + /// + Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Magnetometer data (1 day) + /// + Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Magnetometer data (3 days) + /// + Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Magnetometer data (7 days) + /// + Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (2 hours) + /// + Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (1 day) + /// + Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (3 days) + /// + Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (7 days) + /// + Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken); +} diff --git a/src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs b/src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs new file mode 100644 index 0000000..46d35d3 --- /dev/null +++ b/src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs @@ -0,0 +1,20 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; + +/// +/// 1-minute averaged Real-time Interplanetary Magnetic Field Values (DSCOVR) +/// +/// Date and time of record (UTC) +/// IMF GSM x-component +/// IMF GSM y-component +/// IMF GSM z-component +/// IMF module +/// Spacecraft latitude +/// Spacecraft longitude +public record MagnetometerRecord( + DateTime DateTime, + float? Bx, + float? By, + float? Bz, + float? Bt, + float? Latitude, + float? Longitude); diff --git a/src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs b/src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs new file mode 100644 index 0000000..9b4c277 --- /dev/null +++ b/src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs @@ -0,0 +1,15 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; + +/// +/// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma (DSCOVR) +/// +/// Date and time of record (UTC) +/// Solar Wind proton density +/// Solar Wind plasma speed +/// Solar Wind Ion Temp +public record SolarWindPlasmaRecord( + DateTime DateTime, + float? ProtonDensity, + float? BulkSpeed, + float? IonTemperature +); diff --git a/src/ExternalResources/ExternalResources.csproj b/src/ExternalResources/ExternalResources.csproj new file mode 100644 index 0000000..c4422ef --- /dev/null +++ b/src/ExternalResources/ExternalResources.csproj @@ -0,0 +1,14 @@ + + + + AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources + + + + + + + + + + diff --git a/src/ExternalResources/Infrastructure/ApiResource.cs b/src/ExternalResources/Infrastructure/ApiResource.cs new file mode 100644 index 0000000..63e5a95 --- /dev/null +++ b/src/ExternalResources/Infrastructure/ApiResource.cs @@ -0,0 +1,28 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure; + +/// +/// Relative paths to target data +/// +public static class ApiResource +{ + /// + /// Folder with php scripts for Pc index data + /// + public static class PcIndex + { + /// + /// Base path to php scripts + /// + public const string BasePath = "ovation_test/"; + + /// + /// Relative path to PcN data + /// + public const string PcN = "make_json_pc.php?ns=pcn"; + + /// + /// Relative path to PcS data + /// + public const string PcS = "make_json_pc.php?ns=pcs"; + } +} diff --git a/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs b/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs new file mode 100644 index 0000000..38ab2b8 --- /dev/null +++ b/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs @@ -0,0 +1,36 @@ +using AuroraScienceHub.Framework.Http; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; + +internal abstract class AariGeophysClientBase +{ + private readonly Uri _baseUri; + private readonly HttpClient _httpClient; + + /// + /// Relative path to data generating scripts + /// + protected abstract string BasePath { get; } + + /// .ctor + protected AariGeophysClientBase(HttpClient httpClient, IOptions options) + { + _baseUri = options.Value.RequiredServerUrl; + _httpClient = httpClient; + } + + /// + /// Build full URL to the file + /// + /// File name + protected Uri GetPathToData(string dataUrl) => UrlBuilder.From(_baseUri, BasePath + dataUrl).Build(); + + /// + /// Send request + /// + /// Request + /// Cancellation token + protected async Task SendRequestAsync(HttpRequestMessage request, + CancellationToken cancellationToken) => await _httpClient.SendAsync(request, cancellationToken); +} diff --git a/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs b/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs new file mode 100644 index 0000000..7b6843d --- /dev/null +++ b/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs @@ -0,0 +1,17 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; + +/// +/// HTTP client options for geophysics data import. +/// +public sealed class AariGeophysClientOptions +{ + public const string OptionKey = "AariGeophys"; + + public Uri? ServerUrl { get; init; } + + public Uri RequiredServerUrl => EnsureNotNull(ServerUrl, nameof(ServerUrl)); + + private static T EnsureNotNull(T? value, string name) + where T : class + => value ?? throw new ArgumentNullException(name, $"Configuration value '{OptionKey}:{name}' is not set."); +} diff --git a/src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs b/src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs new file mode 100644 index 0000000..4de1591 --- /dev/null +++ b/src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs @@ -0,0 +1,12 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; + +public sealed class NoaaClientOptions +{ + public const string OptionKey = "Noaa"; + + private const string EmptyServerUrlMessage = $"Configuration value '{OptionKey}:{nameof(ServerUrl)}' is not set."; + + public Uri? ServerUrl { get; set; } + + public Uri RequiredServerUrl => ServerUrl ?? throw new ArgumentNullException(nameof(ServerUrl), EmptyServerUrlMessage); +} diff --git a/src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs b/src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs new file mode 100644 index 0000000..1032258 --- /dev/null +++ b/src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs @@ -0,0 +1,83 @@ +using System.Diagnostics.CodeAnalysis; +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; + +// 27-day KP-index forecast data example: +// :Product: 27-day Space Weather Outlook Table 27DO.txt +// :Issued: 2025 Jan 06 0242 UTC +// # Prepared by the US Dept. of Commerce, NOAA, Space Weather Prediction Center +// # Product description and SWPC contact on the Web +// # https://www.swpc.noaa.gov/content/subscription-services +// # +// # 27-day Space Weather Outlook Table +// # Issued 2025-01-06 +// # +// # UTC Radio Flux Planetary Largest +// # Date 10.7 cm A Index Kp Index +// 2025 Jan 06 172 22 5 +// 2025 Jan 07 165 12 4 +// 2025 Jan 08 165 8 3 + +internal static class KpIndex27DayDataParser +{ + private const int ForecastDaysCount = 27; + + public static IReadOnlyList Parse(string text) + { + var responses = new List(ForecastDaysCount); + + var lineEntries = text.SplitLines(); + foreach (var lineEntry in lineEntries) + { + if (TryParseLine(lineEntry.Line, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseLine(ReadOnlySpan line, [NotNullWhen(true)] out KpIndex27DayResponse? response) + { + var trimmedLine = line.Trim(); + if (trimmedLine.IsEmpty || trimmedLine[0] == '#' || trimmedLine[0] == ':') + { + response = null; + return false; + } + + const int fieldsInRowCount = 6; + Span fieldsRange = stackalloc Range[fieldsInRowCount]; + var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + if (rangesCount != fieldsInRowCount) + { + response = null; + return false; + } + + var yearString = trimmedLine[fieldsRange[0]]; + var monthString = trimmedLine[fieldsRange[1]]; + var dayString = trimmedLine[fieldsRange[2]]; + + var dateString = string.Concat(yearString, monthString, dayString); + if (!DateOnly.TryParse(dateString, out var date)) + { + response = null; + return false; + } + + var kpIndexString = trimmedLine[fieldsRange[5]]; + if (!int.TryParse(kpIndexString, out var kpIndex)) + { + response = null; + return false; + } + + response = new KpIndex27DayResponse(date, kpIndex); + return true; + } +} diff --git a/src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs b/src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs new file mode 100644 index 0000000..88d86b7 --- /dev/null +++ b/src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs @@ -0,0 +1,75 @@ +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Text.Json; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; + +// 3-day KP-index forecast data example: +// [ +// [ +// "time_tag", +// "kp", +// "observed", +// "noaa_scale" +// ], +// [ +// "2025-01-04 00:00:00", +// "2.67", +// "observed", +// null +// ] +// ] + +internal static class KpIndex3DayDataParser +{ + public static IReadOnlyList Parse(string text) + { + using var jsonDocument = JsonDocument.Parse(text); + var rootElement = jsonDocument.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) + { + return Array.Empty(); + } + + var responses = new List(arrayLength); + foreach (var jsonElement in rootElement.EnumerateArray().Skip(1)) + { + if (TryParseElement(jsonElement, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out KpIndex3DayResponse? response) + { + if (jsonElement.ValueKind != JsonValueKind.Array || + jsonElement.GetArrayLength() < 2) + { + response = null; + return false; + } + + var dateTimeString = jsonElement[0].GetString(); + if (!DateTime.TryParse(dateTimeString, out var dateTime)) + { + response = null; + return false; + } + + var kpIndexString = jsonElement[1].GetString(); + if (!float.TryParse(kpIndexString, NumberFormatInfo.InvariantInfo, out var kpIndex)) + { + response = null; + return false; + } + + response = new KpIndex3DayResponse(dateTime, kpIndex); + return true; + } +} diff --git a/src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs b/src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs new file mode 100644 index 0000000..82e810e --- /dev/null +++ b/src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs @@ -0,0 +1,82 @@ +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Text.Json; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; + +// Current KP-index forecast data example: +// [ +// [ +// "time_tag", +// "Kp", +// "a_running", +// "station_count" +// ], +// [ +// "2025-01-05 00:00:00.000", +// "3.67", +// "22", +// "8" +// ] +// ] + +internal static class KpIndexNowcastDataParser +{ + public static IReadOnlyList Parse(string text) + { + using var jsonDocument = JsonDocument.Parse(text); + var rootElement = jsonDocument.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) + { + return Array.Empty(); + } + + var responses = new List(arrayLength); + foreach (var jsonElement in rootElement.EnumerateArray().Skip(1)) + { + if (TryParseElement(jsonElement, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out KpIndexNowcastResponse? response) + { + if (jsonElement.ValueKind != JsonValueKind.Array || + jsonElement.GetArrayLength() < 4) + { + response = null; + return false; + } + + var dateTimeString = jsonElement[0].GetString(); + if (!DateTime.TryParse(dateTimeString, out var dateTime)) + { + response = null; + return false; + } + + var kpIndexString = jsonElement[1].GetString(); + if (!float.TryParse(kpIndexString, NumberFormatInfo.InvariantInfo, out var kpIndex)) + { + response = null; + return false; + } + + var stationsCountString = jsonElement[3].GetString(); + if (!int.TryParse(stationsCountString, NumberFormatInfo.InvariantInfo, out var stationsCount)) + { + response = null; + return false; + } + + response = new KpIndexNowcastResponse(dateTime, kpIndex, stationsCount); + return true; + } +} diff --git a/src/ExternalResources/KpIndex/IKpIndexClient.cs b/src/ExternalResources/KpIndex/IKpIndexClient.cs new file mode 100644 index 0000000..1387510 --- /dev/null +++ b/src/ExternalResources/KpIndex/IKpIndexClient.cs @@ -0,0 +1,24 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex; + +/// +/// KP-index client +/// +public interface IKpIndexClient +{ + /// + /// Get 27-day KP-index forecast + /// + Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken); + + /// + /// Get 3-day KP-index forecast + /// + Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken); + + /// + /// Get KP-index nowcast + /// + Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken); +} diff --git a/src/ExternalResources/KpIndex/KpIndexClient.cs b/src/ExternalResources/KpIndex/KpIndexClient.cs new file mode 100644 index 0000000..c065790 --- /dev/null +++ b/src/ExternalResources/KpIndex/KpIndexClient.cs @@ -0,0 +1,50 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex; + +internal sealed class KpIndexClient : IKpIndexClient +{ + private readonly ILogger _logger; + private readonly HttpClient _client; + private readonly Uri _baseUrl; + + public KpIndexClient( + ILogger logger, + HttpClient client, + IOptions options) + { + _logger = logger; + _client = client; + _baseUrl = options.Value.RequiredServerUrl; + } + + public async Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken) + { + var text = await GetStringOrDefaultAsync("text/27-day-outlook.txt", cancellationToken).ConfigureAwait(false); + return string.IsNullOrWhiteSpace(text) ? [] : KpIndex27DayDataParser.Parse(text); + } + + public async Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken) + { + var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index-forecast.json", cancellationToken).ConfigureAwait(false); + return string.IsNullOrWhiteSpace(text) ? [] : KpIndex3DayDataParser.Parse(text); + } + + public async Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken) + { + var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index.json", cancellationToken).ConfigureAwait(false); + return string.IsNullOrWhiteSpace(text) ? [] : KpIndexNowcastDataParser.Parse(text); + } + + private async Task GetStringOrDefaultAsync(string relativeUrl, CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, relativeUrl); + var response = await _client.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + } +} diff --git a/src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs b/src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs new file mode 100644 index 0000000..d07a122 --- /dev/null +++ b/src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs @@ -0,0 +1,10 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +/// +/// 27-day KP-index data +/// +/// Date of record +/// KP-index +public sealed record KpIndex27DayResponse( + DateOnly Date, + int KpIndex); diff --git a/src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs b/src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs new file mode 100644 index 0000000..7bfaa49 --- /dev/null +++ b/src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs @@ -0,0 +1,8 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +/// +/// 3-day KP-index data +/// +/// Date and time of record (UTC) +/// KP-index +public sealed record KpIndex3DayResponse(DateTime DateTime, float KpIndex); diff --git a/src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs b/src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs new file mode 100644 index 0000000..4c50e2b --- /dev/null +++ b/src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs @@ -0,0 +1,12 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; + +/// +/// Current KP-index data +/// +/// Date and time of record (UTC) +/// KP-index +/// KP-index calculated by stations count +public sealed record KpIndexNowcastResponse( + DateTime DateTime, + float KpIndex, + int StationsCount); diff --git a/src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs b/src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs new file mode 100644 index 0000000..eed4d95 --- /dev/null +++ b/src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs @@ -0,0 +1,66 @@ +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Text.Json; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Extensions; + +/// +/// Pc-index raw data parser +/// +internal static class PcIndexDataParser +{ + /// + /// Parse raw Pc-index data + /// + /// Content of Pc-index raw response + /// + /// Example: + /// [[1766441400000,3.2202699184417725],[1766441460000,3.098059892654419],[1766441520000,2.9881300926208496],...]] + /// where first value is Unix time in milliseconds, second value is Pc-index. + /// + public static IReadOnlyList Parse(string content) + { + using var jsonDocument = JsonDocument.Parse(content); + var rootElement = jsonDocument.RootElement; + var arrayLength = rootElement.GetArrayLength(); + + if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 1) + { + return []; + } + + var responses = new List(arrayLength); + + foreach (var jsonElement in rootElement.EnumerateArray()) + { + if (TryParseElement(jsonElement, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out PcIndexResponse? response) + { + if (jsonElement.ValueKind != JsonValueKind.Array + || jsonElement.GetArrayLength() < 2 + || jsonElement[0].GetInt64() is 0) + { + response = null; + return false; + } + + var dateTime = DateTimeOffset.FromUnixTimeMilliseconds(jsonElement[0].GetInt64()).DateTime; + + var pcIndexRaw = jsonElement[1].GetRawText(); + float? pcIndex = float.TryParse(pcIndexRaw, NumberFormatInfo.InvariantInfo, out var pcIndexFloat) + ? pcIndexFloat + : null; + + response = new PcIndexResponse(dateTime, pcIndex); + return true; + } +} diff --git a/src/ExternalResources/PcIndex/IPcIndexClient.cs b/src/ExternalResources/PcIndex/IPcIndexClient.cs new file mode 100644 index 0000000..e25190c --- /dev/null +++ b/src/ExternalResources/PcIndex/IPcIndexClient.cs @@ -0,0 +1,19 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex; + +/// +/// Pc-index client +/// +public interface IPcIndexClient +{ + /// + /// Get Northern Pc-index from AARI web-server + /// + Task> GetPcNIndexAsync(CancellationToken cancellationToken); + + /// + /// Get Southern Pc-index from AARI web-server + /// + Task> GetPcSIndexAsync(CancellationToken cancellationToken); +} diff --git a/src/ExternalResources/PcIndex/PcIndexClient.cs b/src/ExternalResources/PcIndex/PcIndexClient.cs new file mode 100644 index 0000000..907cd4a --- /dev/null +++ b/src/ExternalResources/PcIndex/PcIndexClient.cs @@ -0,0 +1,34 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Extensions; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex; + +internal sealed class PcIndexClient : AariGeophysClientBase, IPcIndexClient +{ + protected override string BasePath => ApiResource.PcIndex.BasePath; + + public PcIndexClient(HttpClient client, IOptions options) + : base(client, options) { } + + public async Task> GetPcNIndexAsync(CancellationToken cancellationToken) + => await GetPcIndexAsync(ApiResource.PcIndex.PcN, cancellationToken).ConfigureAwait(false); + + public async Task> GetPcSIndexAsync(CancellationToken cancellationToken) + => await GetPcIndexAsync(ApiResource.PcIndex.PcS, cancellationToken).ConfigureAwait(false); + + + private async Task> GetPcIndexAsync(string pcUrl, CancellationToken cancellationToken) + { + var requestUrl = GetPathToData(pcUrl); + var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); + using var response = await SendRequestAsync(request, cancellationToken); + response.EnsureSuccessStatusCode(); + + var content = await response.Content.ReadAsStringAsync(cancellationToken); + + return string.IsNullOrWhiteSpace(content) ? [] : PcIndexDataParser.Parse(content); + } +} diff --git a/src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs b/src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs new file mode 100644 index 0000000..7396559 --- /dev/null +++ b/src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs @@ -0,0 +1,8 @@ +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; + +/// +/// PC-index data +/// +/// Date and time of record (UTC) +/// Northern or Southern PC-index +public sealed record PcIndexResponse(DateTime DateTime, float? Pc); diff --git a/src/ExternalResources/ServiceCollectionExtensions.cs b/src/ExternalResources/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..88b8ad0 --- /dev/null +++ b/src/ExternalResources/ServiceCollectionExtensions.cs @@ -0,0 +1,26 @@ +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex; +using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex; +using Microsoft.Extensions.DependencyInjection; + +namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddAceClient(this IServiceCollection services) + { + services.AddOptions() + .BindConfiguration(NoaaClientOptions.OptionKey); + services.AddOptions() + .BindConfiguration(AariGeophysClientOptions.OptionKey); + + services.AddHttpClient(); + services.AddHttpClient(); + services.AddHttpClient(); + services.AddHttpClient(); + + return services; + } +} diff --git a/src/Noaa/Ace/AceClient.cs b/src/Noaa/Ace/AceClient.cs new file mode 100644 index 0000000..0831a86 --- /dev/null +++ b/src/Noaa/Ace/AceClient.cs @@ -0,0 +1,39 @@ +using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.Integrations.Noaa.Ace; + +internal sealed class AceClient : IAceClient +{ + private readonly HttpClient _httpClient; + private readonly Uri _baseUrl; + + public AceClient( + HttpClient httpClient, + IOptions options) + { + _httpClient = httpClient; + _baseUrl = options.Value.RequiredServerUrl; + } + + public async Task> GetMagnetometerDataAsync(CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, "text/ace-magnetometer.txt"); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + + return MagnetometerDataParser.Parse(text); + } + + public async Task> GetSwepamDataAsync(CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, "text/ace-swepam.txt"); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + + return SolarWindPlasmaDataParser.Parse(text); + } +} diff --git a/src/Noaa/Ace/Extensions/MagnetometerDataParser.cs b/src/Noaa/Ace/Extensions/MagnetometerDataParser.cs new file mode 100644 index 0000000..41897a1 --- /dev/null +++ b/src/Noaa/Ace/Extensions/MagnetometerDataParser.cs @@ -0,0 +1,67 @@ +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.Integrations.Noaa.Ace.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.Ace.Extensions; + +// ACE Magnetometer data example: +// # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +// # Missing data values: -999.9 +// # Modified Seconds +// # UT Date Time Julian of the ---------------- GSM Coordinates --------------- +// # YR MO DA HHMM Day Day S Bx By Bz Bt Lat. Long. +// #------------------------------------------------------------------------------------ +// 2024 05 05 0846 60435 31560 0 -0.7 -0.8 -1.9 2.2 -60.5 225.8 +internal static class MagnetometerDataParser +{ + private const string MissingDataValue = "-999.9"; + + public static IReadOnlyList Parse(string text) + { + var records = new List(); + var lines = text.SplitLines(); + Span fieldsRange = stackalloc Range[32]; + + foreach (var line in lines) + { + var trimmedLine = line.Line.Trim(); + if (trimmedLine.Length == 0 || trimmedLine[0] == '#') + { + continue; + } + var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + // check if line contains data + if (rangesCount != 13 || !trimmedLine[fieldsRange[0]].IsParsableAsInt()) + { + continue; + } + + var record = new MagnetometerRecord + ( + DateTime: new DateTime( + year: trimmedLine[fieldsRange[0]].ParseIntInvariant(), + month: trimmedLine[fieldsRange[1]].ParseIntInvariant(), + day: trimmedLine[fieldsRange[2]].ParseIntInvariant(), + hour: trimmedLine[fieldsRange[3]][..2].ParseIntInvariant(), + minute: trimmedLine[fieldsRange[3]][2..].ParseIntInvariant(), + second: 0, + DateTimeKind.Utc), + Status: trimmedLine[fieldsRange[6]].ParseIntInvariant(), + Bx: GetFloatOrNull(trimmedLine[fieldsRange[7]]), + By: GetFloatOrNull(trimmedLine[fieldsRange[8]]), + Bz: GetFloatOrNull(trimmedLine[fieldsRange[9]]), + Bt: GetFloatOrNull(trimmedLine[fieldsRange[10]]), + Latitude: GetFloatOrNull(trimmedLine[fieldsRange[11]]), + Longitude: GetFloatOrNull(trimmedLine[fieldsRange[12]]) + ); + records.Add(record); + } + + return records; + } + + private static float? GetFloatOrNull(ReadOnlySpan value) + => value.SequenceEqual(MissingDataValue) + ? null + : value.ParseFloatInvariant(); +} diff --git a/src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs b/src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs new file mode 100644 index 0000000..3d7b9cc --- /dev/null +++ b/src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs @@ -0,0 +1,70 @@ +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.Integrations.Noaa.Ace.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.Ace.Extensions; + +// # 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma +// # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +// # Missing data values: Density and Speed = -9999.9, Temp. = -1.00e+05 +// # Modified Seconds ------------- Solar Wind ----------- +// # UT Date Time Julian of the Proton Bulk Ion +// # YR MO DA HHMM Day Day S Density Speed Temperature +// #------------------------------------------------------------------------- +// 2024 05 06 1657 60436 61020 1 4.9 475.0 2.38e+05 +internal static class SolarWindPlasmaDataParser +{ + private const string MissingDataValue = "-9999.9"; + private const string MissingTemperatureValue = "-1.00e+05"; + + public static IReadOnlyList Parse(string text) + { + var records = new List(); + var lines = text.SplitLines(); + Span fieldsRange = stackalloc Range[32]; + + foreach (var line in lines) + { + var trimmedLine = line.Line.Trim(); + if (trimmedLine.Length == 0 || trimmedLine[0] == '#') + { + continue; + } + var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + // check if line contains data + if (rangesCount != 10 || !trimmedLine[fieldsRange[0]].IsParsableAsInt()) + { + continue; + } + + var record = new SolarWindPlasmaRecord + ( + DateTime: new DateTime( + year: trimmedLine[fieldsRange[0]].ParseIntInvariant(), + month: trimmedLine[fieldsRange[1]].ParseIntInvariant(), + day: trimmedLine[fieldsRange[2]].ParseIntInvariant(), + hour: trimmedLine[fieldsRange[3]][..2].ParseIntInvariant(), + minute: trimmedLine[fieldsRange[3]][2..].ParseIntInvariant(), + second: 0, + DateTimeKind.Utc), + Status: trimmedLine[fieldsRange[6]].ParseIntInvariant(), + ProtonDensity: GetFloatOrNull(trimmedLine[fieldsRange[7]]), + BulkSpeed: GetFloatOrNull(trimmedLine[fieldsRange[8]]), + IonTemperature: GetTemperatureOrNull(trimmedLine[fieldsRange[9]]) + ); + records.Add(record); + } + + return records; + } + + private static float? GetFloatOrNull(ReadOnlySpan value) + => value.SequenceEqual(MissingDataValue) + ? null + : value.ParseFloatInvariant(); + + private static float? GetTemperatureOrNull(ReadOnlySpan value) + => value.SequenceEqual(MissingTemperatureValue) + ? null + : value.ParseFloatInvariant(); +} diff --git a/src/Noaa/Ace/IAceClient.cs b/src/Noaa/Ace/IAceClient.cs new file mode 100644 index 0000000..06ab9b0 --- /dev/null +++ b/src/Noaa/Ace/IAceClient.cs @@ -0,0 +1,19 @@ +using AuroraScienceHub.Integrations.Noaa.Ace.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.Ace; + +/// +/// ACE Spacecraft client +/// +public interface IAceClient +{ + /// + /// Get ACE Magnetometer data + /// + Task> GetMagnetometerDataAsync(CancellationToken cancellationToken); + + /// + /// Get ACE Solar Wind Electron Proton Alpha Monitor data + /// + Task> GetSwepamDataAsync(CancellationToken cancellationToken); +} diff --git a/src/Noaa/Ace/Responses/MagnetometerRecord.cs b/src/Noaa/Ace/Responses/MagnetometerRecord.cs new file mode 100644 index 0000000..f57c45b --- /dev/null +++ b/src/Noaa/Ace/Responses/MagnetometerRecord.cs @@ -0,0 +1,22 @@ +namespace AuroraScienceHub.Integrations.Noaa.Ace.Responses; + +/// +/// 1-minute averaged Real-time Interplanetary Magnetic Field Values +/// +/// Date and time of record (UTC) +/// Data Status. 0 = nominal data 1 to 8 = bad data record 9 = no data +/// IMF GSM x-component +/// IMF GSM y-component +/// IMF GSM z-component +/// IMF module +/// Spacecraft latitude +/// Spacecraft longitude +public record MagnetometerRecord( + DateTime DateTime, + int Status, + float? Bx, + float? By, + float? Bz, + float? Bt, + float? Latitude, + float? Longitude); diff --git a/src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs b/src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs new file mode 100644 index 0000000..189243b --- /dev/null +++ b/src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs @@ -0,0 +1,17 @@ +namespace AuroraScienceHub.Integrations.Noaa.Ace.Responses; + +/// +/// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma +/// +/// Date and time of record (UTC) +/// Data Status. 0 = nominal data 1 to 8 = bad data record 9 = no data +/// Solar Wind proton density +/// Solar Wind plasma speed +/// Solar Wind Ion Temp +public record SolarWindPlasmaRecord( + DateTime DateTime, + int Status, + float? ProtonDensity, + float? BulkSpeed, + float? IonTemperature +); diff --git a/src/Noaa/Dscovr/DscovrClient.cs b/src/Noaa/Dscovr/DscovrClient.cs new file mode 100644 index 0000000..4376817 --- /dev/null +++ b/src/Noaa/Dscovr/DscovrClient.cs @@ -0,0 +1,71 @@ +using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.Integrations.Noaa.Dscovr; + +internal sealed class DscovrClient : IDscovrClient +{ + private readonly HttpClient _httpClient; + private readonly Uri _baseUrl; + + public DscovrClient( + HttpClient httpClient, + IOptions options) + { + _httpClient = httpClient; + _baseUrl = options.Value.RequiredServerUrl; + } + + public async Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-2-hour.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-1-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-3-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken) + => await GetMagnetometerDataAsync("/products/solar-wind/mag-7-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-2-hour.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-1-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-3-day.json", cancellationToken) + .ConfigureAwait(false); + + public async Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken) + => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-7-day.json", cancellationToken) + .ConfigureAwait(false); + + private async Task> GetMagnetometerDataAsync(string relativeUri, CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, relativeUri); + var response = await _httpClient.GetAsync(url, cancellationToken); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken); + + return MagnetometerDataParser.Parse(text); + } + + private async Task> GetSolarWindPlasmaDataAsync(string relativeUri, CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, relativeUri); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + + return SolarWindPlasmaDataParser.Parse(text); + } +} diff --git a/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs b/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs new file mode 100644 index 0000000..d8d40eb --- /dev/null +++ b/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs @@ -0,0 +1,88 @@ +using System.Text.Json; +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; + +// DSCOVR Magnetometer data example: +// [ +// [ +// "time_tag", +// "bx_gsm", +// "by_gsm", +// "bz_gsm", +// "lon_gsm", +// "lat_gsm", +// "bt" +// ], +// [ +// "2024-05-19 16:50:00.000", +// "-2.25", +// "8.71", +// "-1.79", +// "104.50", +// "-11.25", +// "9.17" +// ] +// ] +internal static class MagnetometerDataParser +{ + private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; + + public static IReadOnlyList Parse(string text) + { + using var jsonDoc = JsonDocument.Parse(text); + var rootElement = jsonDoc.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) + { + return Array.Empty(); + } + + var fieldNames = rootElement[0]; + var magnetometerRecords = new List(arrayLength); + + var timeTagIndex = GetIndex(fieldNames, "time_tag"); + var bxGsmIndex = GetIndex(fieldNames, "bx_gsm"); + var byGsmIndex = GetIndex(fieldNames, "by_gsm"); + var bzGsmIndex = GetIndex(fieldNames, "bz_gsm"); + var btIndex = GetIndex(fieldNames, "bt"); + var latGsmIndex = GetIndex(fieldNames, "lat_gsm"); + var lonGsmIndex = GetIndex(fieldNames, "lon_gsm"); + + foreach (var record in rootElement.EnumerateArray().Skip(1)) + { + magnetometerRecords.Add(new MagnetometerRecord( + DateTime: DateTime.ParseExact( + record[timeTagIndex].GetString().Required(), DateTimeFormat, + provider: null, + style: System.Globalization.DateTimeStyles.AssumeUniversal | + System.Globalization.DateTimeStyles.AdjustToUniversal), + Bx: record[bxGsmIndex].GetString()?.ParseFloatInvariant(), + By: record[byGsmIndex].GetString()?.ParseFloatInvariant(), + Bz: record[bzGsmIndex].GetString()?.ParseFloatInvariant(), + Bt: record[btIndex].GetString()?.ParseFloatInvariant(), + Latitude: record[latGsmIndex].GetString()?.ParseFloatInvariant(), + Longitude: record[lonGsmIndex].GetString()?.ParseFloatInvariant() + )); + } + + return magnetometerRecords; + } + + private static int GetIndex(JsonElement fieldNames, string fieldName) + { + var index = 0; + foreach (var name in fieldNames.EnumerateArray()) + { + if (string.Equals(name.GetString(), fieldName, StringComparison.OrdinalIgnoreCase)) + { + return index; + } + index++; + } + + throw new InvalidOperationException($"Field '{fieldName}' not found."); + } +} diff --git a/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs b/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs new file mode 100644 index 0000000..27d6299 --- /dev/null +++ b/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs @@ -0,0 +1,82 @@ +using System.Text.Json; +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; + +// DSCOVR Solar wind plasma data example: +// [ +// [ +// "time_tag", +// "density", +// "speed", +// "temperature" +// ], +// [ +// "2024-05-20 05:51:00.000", +// "2.18", +// "393.9", +// "36967" +// ], +// [ +// "2024-05-20 05:52:00.000", +// "2.60", +// "397.4", +// "44618" +// ] +// ] +internal static class SolarWindPlasmaDataParser +{ + private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; + + public static IReadOnlyList Parse(string text) + { + using var jsonDoc = JsonDocument.Parse(text); + var rootElement = jsonDoc.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) + { + return Array.Empty(); + } + + var fieldNames = rootElement[0]; + var solarWindPlasmaRecords = new List(arrayLength); + + var timeTagIndex = GetIndex(fieldNames, "time_tag"); + var densityIndex = GetIndex(fieldNames, "density"); + var speedIndex = GetIndex(fieldNames, "speed"); + var temperatureIndex = GetIndex(fieldNames, "temperature"); + + foreach (var record in rootElement.EnumerateArray().Skip(1)) + { + solarWindPlasmaRecords.Add(new SolarWindPlasmaRecord( + DateTime: DateTime.ParseExact( + record[timeTagIndex].GetString().Required(), DateTimeFormat, + provider: null, + style: System.Globalization.DateTimeStyles.AssumeUniversal | + System.Globalization.DateTimeStyles.AdjustToUniversal), + ProtonDensity: record[densityIndex].GetString()?.ParseFloatInvariant(), + BulkSpeed: record[speedIndex].GetString()?.ParseFloatInvariant(), + IonTemperature: record[temperatureIndex].GetString()?.ParseFloatInvariant() + )); + } + + return solarWindPlasmaRecords; + } + + private static int GetIndex(JsonElement fieldNames, string fieldName) + { + var index = 0; + foreach (var name in fieldNames.EnumerateArray()) + { + if (string.Equals(name.GetString(), fieldName, StringComparison.OrdinalIgnoreCase)) + { + return index; + } + index++; + } + + throw new InvalidOperationException($"Field '{fieldName}' not found."); + } +} diff --git a/src/Noaa/Dscovr/IDscovrClient.cs b/src/Noaa/Dscovr/IDscovrClient.cs new file mode 100644 index 0000000..59391f3 --- /dev/null +++ b/src/Noaa/Dscovr/IDscovrClient.cs @@ -0,0 +1,49 @@ +using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.Dscovr; + +/// +/// DSCOVR Spacecraft client +/// +public interface IDscovrClient +{ + /// + /// Get DSCOVR Magnetometer data (2 hours) + /// + Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Magnetometer data (1 day) + /// + Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Magnetometer data (3 days) + /// + Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Magnetometer data (7 days) + /// + Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (2 hours) + /// + Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (1 day) + /// + Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (3 days) + /// + Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken); + + /// + /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (7 days) + /// + Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken); +} diff --git a/src/Noaa/Dscovr/Responses/MagnetometerRecord.cs b/src/Noaa/Dscovr/Responses/MagnetometerRecord.cs new file mode 100644 index 0000000..6d6876a --- /dev/null +++ b/src/Noaa/Dscovr/Responses/MagnetometerRecord.cs @@ -0,0 +1,20 @@ +namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; + +/// +/// 1-minute averaged Real-time Interplanetary Magnetic Field Values (DSCOVR) +/// +/// Date and time of record (UTC) +/// IMF GSM x-component +/// IMF GSM y-component +/// IMF GSM z-component +/// IMF module +/// Spacecraft latitude +/// Spacecraft longitude +public record MagnetometerRecord( + DateTime DateTime, + float? Bx, + float? By, + float? Bz, + float? Bt, + float? Latitude, + float? Longitude); diff --git a/src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs b/src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs new file mode 100644 index 0000000..d9b1248 --- /dev/null +++ b/src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs @@ -0,0 +1,15 @@ +namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; + +/// +/// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma (DSCOVR) +/// +/// Date and time of record (UTC) +/// Solar Wind proton density +/// Solar Wind plasma speed +/// Solar Wind Ion Temp +public record SolarWindPlasmaRecord( + DateTime DateTime, + float? ProtonDensity, + float? BulkSpeed, + float? IonTemperature +); diff --git a/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs b/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs new file mode 100644 index 0000000..eb87a06 --- /dev/null +++ b/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs @@ -0,0 +1,83 @@ +using System.Diagnostics.CodeAnalysis; +using AuroraScienceHub.Framework.Utilities.System; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; + +// 27-day KP-index forecast data example: +// :Product: 27-day Space Weather Outlook Table 27DO.txt +// :Issued: 2025 Jan 06 0242 UTC +// # Prepared by the US Dept. of Commerce, NOAA, Space Weather Prediction Center +// # Product description and SWPC contact on the Web +// # https://www.swpc.noaa.gov/content/subscription-services +// # +// # 27-day Space Weather Outlook Table +// # Issued 2025-01-06 +// # +// # UTC Radio Flux Planetary Largest +// # Date 10.7 cm A Index Kp Index +// 2025 Jan 06 172 22 5 +// 2025 Jan 07 165 12 4 +// 2025 Jan 08 165 8 3 + +internal static class KpIndex27DayDataParser +{ + private const int ForecastDaysCount = 27; + + public static IReadOnlyList Parse(string text) + { + var responses = new List(ForecastDaysCount); + + var lineEntries = text.SplitLines(); + foreach (var lineEntry in lineEntries) + { + if (TryParseLine(lineEntry.Line, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseLine(ReadOnlySpan line, [NotNullWhen(true)] out KpIndex27DayResponse? response) + { + var trimmedLine = line.Trim(); + if (trimmedLine.IsEmpty || trimmedLine[0] == '#' || trimmedLine[0] == ':') + { + response = null; + return false; + } + + const int fieldsInRowCount = 6; + Span fieldsRange = stackalloc Range[fieldsInRowCount]; + var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + if (rangesCount != fieldsInRowCount) + { + response = null; + return false; + } + + var yearString = trimmedLine[fieldsRange[0]]; + var monthString = trimmedLine[fieldsRange[1]]; + var dayString = trimmedLine[fieldsRange[2]]; + + var dateString = string.Concat(yearString, monthString, dayString); + if (!DateOnly.TryParse(dateString, out var date)) + { + response = null; + return false; + } + + var kpIndexString = trimmedLine[fieldsRange[5]]; + if (!int.TryParse(kpIndexString, out var kpIndex)) + { + response = null; + return false; + } + + response = new KpIndex27DayResponse(date, kpIndex); + return true; + } +} diff --git a/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs b/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs new file mode 100644 index 0000000..6019188 --- /dev/null +++ b/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs @@ -0,0 +1,75 @@ +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Text.Json; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; + +// 3-day KP-index forecast data example: +// [ +// [ +// "time_tag", +// "kp", +// "observed", +// "noaa_scale" +// ], +// [ +// "2025-01-04 00:00:00", +// "2.67", +// "observed", +// null +// ] +// ] + +internal static class KpIndex3DayDataParser +{ + public static IReadOnlyList Parse(string text) + { + using var jsonDocument = JsonDocument.Parse(text); + var rootElement = jsonDocument.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) + { + return Array.Empty(); + } + + var responses = new List(arrayLength); + foreach (var jsonElement in rootElement.EnumerateArray().Skip(1)) + { + if (TryParseElement(jsonElement, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out KpIndex3DayResponse? response) + { + if (jsonElement.ValueKind != JsonValueKind.Array || + jsonElement.GetArrayLength() < 2) + { + response = null; + return false; + } + + var dateTimeString = jsonElement[0].GetString(); + if (!DateTime.TryParse(dateTimeString, out var dateTime)) + { + response = null; + return false; + } + + var kpIndexString = jsonElement[1].GetString(); + if (!float.TryParse(kpIndexString, NumberFormatInfo.InvariantInfo, out var kpIndex)) + { + response = null; + return false; + } + + response = new KpIndex3DayResponse(dateTime, kpIndex); + return true; + } +} diff --git a/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs b/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs new file mode 100644 index 0000000..4198752 --- /dev/null +++ b/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs @@ -0,0 +1,82 @@ +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Text.Json; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; + +// Current KP-index forecast data example: +// [ +// [ +// "time_tag", +// "Kp", +// "a_running", +// "station_count" +// ], +// [ +// "2025-01-05 00:00:00.000", +// "3.67", +// "22", +// "8" +// ] +// ] + +internal static class KpIndexNowcastDataParser +{ + public static IReadOnlyList Parse(string text) + { + using var jsonDocument = JsonDocument.Parse(text); + var rootElement = jsonDocument.RootElement; + + var arrayLength = rootElement.GetArrayLength(); + if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) + { + return Array.Empty(); + } + + var responses = new List(arrayLength); + foreach (var jsonElement in rootElement.EnumerateArray().Skip(1)) + { + if (TryParseElement(jsonElement, out var response)) + { + responses.Add(response); + } + } + + return responses; + } + + private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out KpIndexNowcastResponse? response) + { + if (jsonElement.ValueKind != JsonValueKind.Array || + jsonElement.GetArrayLength() < 4) + { + response = null; + return false; + } + + var dateTimeString = jsonElement[0].GetString(); + if (!DateTime.TryParse(dateTimeString, out var dateTime)) + { + response = null; + return false; + } + + var kpIndexString = jsonElement[1].GetString(); + if (!float.TryParse(kpIndexString, NumberFormatInfo.InvariantInfo, out var kpIndex)) + { + response = null; + return false; + } + + var stationsCountString = jsonElement[3].GetString(); + if (!int.TryParse(stationsCountString, NumberFormatInfo.InvariantInfo, out var stationsCount)) + { + response = null; + return false; + } + + response = new KpIndexNowcastResponse(dateTime, kpIndex, stationsCount); + return true; + } +} diff --git a/src/Noaa/KpIndex/IKpIndexClient.cs b/src/Noaa/KpIndex/IKpIndexClient.cs new file mode 100644 index 0000000..2e28582 --- /dev/null +++ b/src/Noaa/KpIndex/IKpIndexClient.cs @@ -0,0 +1,24 @@ +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +namespace AuroraScienceHub.Integrations.Noaa.KpIndex; + +/// +/// KP-index client +/// +public interface IKpIndexClient +{ + /// + /// Get 27-day KP-index forecast + /// + Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken); + + /// + /// Get 3-day KP-index forecast + /// + Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken); + + /// + /// Get KP-index nowcast + /// + Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken); +} diff --git a/src/Noaa/KpIndex/KpIndexClient.cs b/src/Noaa/KpIndex/KpIndexClient.cs new file mode 100644 index 0000000..ca85277 --- /dev/null +++ b/src/Noaa/KpIndex/KpIndexClient.cs @@ -0,0 +1,49 @@ +using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace AuroraScienceHub.Integrations.Noaa.KpIndex; + +internal sealed class KpIndexClient : IKpIndexClient +{ + private readonly ILogger _logger; + private readonly HttpClient _client; + private readonly Uri _baseUrl; + + public KpIndexClient( + ILogger logger, + HttpClient client, + IOptions options) + { + _logger = logger; + _client = client; + _baseUrl = options.Value.RequiredServerUrl; + } + + public async Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken) + { + var text = await GetStringOrDefaultAsync("text/27-day-outlook.txt", cancellationToken).ConfigureAwait(false); + return string.IsNullOrWhiteSpace(text) ? [] : KpIndex27DayDataParser.Parse(text); + } + + public async Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken) + { + var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index-forecast.json", cancellationToken).ConfigureAwait(false); + return string.IsNullOrWhiteSpace(text) ? [] : KpIndex3DayDataParser.Parse(text); + } + + public async Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken) + { + var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index.json", cancellationToken).ConfigureAwait(false); + return string.IsNullOrWhiteSpace(text) ? [] : KpIndexNowcastDataParser.Parse(text); + } + + private async Task GetStringOrDefaultAsync(string relativeUrl, CancellationToken cancellationToken) + { + var url = new Uri(_baseUrl, relativeUrl); + var response = await _client.GetAsync(url, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + } +} diff --git a/src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs b/src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs new file mode 100644 index 0000000..ce4cfaf --- /dev/null +++ b/src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs @@ -0,0 +1,10 @@ +namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +/// +/// 27-day KP-index data +/// +/// Date of record +/// KP-index +public sealed record KpIndex27DayResponse( + DateOnly Date, + int KpIndex); diff --git a/src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs b/src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs new file mode 100644 index 0000000..a83ee4a --- /dev/null +++ b/src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs @@ -0,0 +1,8 @@ +namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +/// +/// 3-day KP-index data +/// +/// Date and time of record (UTC) +/// KP-index +public sealed record KpIndex3DayResponse(DateTime DateTime, float KpIndex); diff --git a/src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs b/src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs new file mode 100644 index 0000000..08a5c75 --- /dev/null +++ b/src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs @@ -0,0 +1,12 @@ +namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; + +/// +/// Current KP-index data +/// +/// Date and time of record (UTC) +/// KP-index +/// KP-index calculated by stations count +public sealed record KpIndexNowcastResponse( + DateTime DateTime, + float KpIndex, + int StationsCount); diff --git a/src/Noaa/Noaa.csproj b/src/Noaa/Noaa.csproj new file mode 100644 index 0000000..54dbf46 --- /dev/null +++ b/src/Noaa/Noaa.csproj @@ -0,0 +1,14 @@ + + + + AuroraScienceHub.Integrations.Noaa + + + + + + + + + + diff --git a/src/Noaa/NoaaClientOptions.cs b/src/Noaa/NoaaClientOptions.cs new file mode 100644 index 0000000..3d913b6 --- /dev/null +++ b/src/Noaa/NoaaClientOptions.cs @@ -0,0 +1,24 @@ +namespace AuroraScienceHub.Integrations.Noaa; + +/// +/// NOAA client options +/// +public sealed class NoaaClientOptions +{ + /// + /// Configuration option key + /// + public const string OptionKey = "Noaa"; + + private const string EmptyServerUrlMessage = $"Configuration value '{OptionKey}:{nameof(ServerUrl)}' is not set."; + + /// + /// NOAA server URL + /// + public Uri? ServerUrl { get; set; } + + /// + /// Gets the required server URL. Throws if not set. + /// + public Uri RequiredServerUrl => ServerUrl ?? throw new ArgumentNullException(nameof(ServerUrl), EmptyServerUrlMessage); +} diff --git a/src/Noaa/ServiceCollectionExtensions.cs b/src/Noaa/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..73c5643 --- /dev/null +++ b/src/Noaa/ServiceCollectionExtensions.cs @@ -0,0 +1,27 @@ +using AuroraScienceHub.Integrations.Noaa.Ace; +using AuroraScienceHub.Integrations.Noaa.Dscovr; +using AuroraScienceHub.Integrations.Noaa.KpIndex; +using Microsoft.Extensions.DependencyInjection; + +namespace AuroraScienceHub.Integrations.Noaa; + +/// +/// to register NOAA clients. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds NOAA clients to the service collection. + /// + public static IServiceCollection AddNoaaClients(this IServiceCollection services) + { + services.AddOptions() + .BindConfiguration(NoaaClientOptions.OptionKey); + + services.AddHttpClient(); + services.AddHttpClient(); + services.AddHttpClient(); + + return services; + } +} diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props new file mode 100644 index 0000000..4e78215 --- /dev/null +++ b/tests/Directory.Build.props @@ -0,0 +1,25 @@ + + + + + + true + $(NoWarn) + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers + + + + + + diff --git a/tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs b/tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs new file mode 100644 index 0000000..279b898 --- /dev/null +++ b/tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs @@ -0,0 +1,58 @@ +using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Ace; + +/// +/// Unit tests for . +/// +public sealed class MagnetometerDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Ace/Samples/AceMagnetometerSample.txt")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = MagnetometerDataParser.Parse(text); + + // Assert + result.ShouldNotBeEmpty(); + result.ShouldBe([ + new MagnetometerRecord + ( + DateTime: new DateTime(2024, 5, 5, 10, 42, 0, DateTimeKind.Utc), + Status: 0, + Bx: 2.3f, + By: 1.8f, + Bz: 2.2f, + Bt: 3.7f, + Latitude: 36.3f, + Longitude: 38.0f + ), + new MagnetometerRecord + ( + DateTime: new DateTime(2024, 5, 5, 10, 43, 0, DateTimeKind.Utc), + Status: 0, + Bx: 2.3f, + By: 1.6f, + Bz: 2.3f, + Bt: 3.6f, + Latitude: 38.7f, + Longitude: 34.4f + ), + new MagnetometerRecord + ( + DateTime: new DateTime(2024, 5, 5, 10, 44, 0, DateTimeKind.Utc), + Status: 9, + Bx: null, + By: null, + Bz: null, + Bt: null, + Latitude: null, + Longitude: null + ) + ]); + } +} diff --git a/tests/UnitTests/Noaa/Ace/Samples/AceMagnetometerSample.txt b/tests/UnitTests/Noaa/Ace/Samples/AceMagnetometerSample.txt new file mode 100644 index 0000000..5aedd98 --- /dev/null +++ b/tests/UnitTests/Noaa/Ace/Samples/AceMagnetometerSample.txt @@ -0,0 +1,23 @@ +:Data_list: ace_mag_1m.txt +:Created: 2024 May 05 1046 UT +# Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center +# Please send comments and suggestions to SWPC.Webmaster@noaa.gov +# +# Magnetometer values are in GSM coordinates. +# +# Units: Bx, By, Bz, Bt in nT +# Units: Latitude degrees +/- 90.0 +# Units: Longitude degrees 0.0 - 360.0 +# Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +# Missing data values: -999.9 +# Source: ACE Satellite - Magnetometer +# +# 1-minute averaged Real-time Interplanetary Magnetic Field Values +# +# Modified Seconds +# UT Date Time Julian of the ---------------- GSM Coordinates --------------- +# YR MO DA HHMM Day Day S Bx By Bz Bt Lat. Long. +#------------------------------------------------------------------------------------ +2024 05 05 1042 60435 38520 0 2.3 1.8 2.2 3.7 36.3 38.0 +2024 05 05 1043 60435 38580 0 2.3 1.6 2.3 3.6 38.7 34.4 +2024 05 05 1044 60435 38640 9 -999.9 -999.9 -999.9 -999.9 -999.9 -999.9 diff --git a/tests/UnitTests/Noaa/Ace/Samples/AceSwepamSample.txt b/tests/UnitTests/Noaa/Ace/Samples/AceSwepamSample.txt new file mode 100644 index 0000000..73558ca --- /dev/null +++ b/tests/UnitTests/Noaa/Ace/Samples/AceSwepamSample.txt @@ -0,0 +1,21 @@ +:Data_list: ace_swepam_1m.txt +:Created: 2024 May 06 1857 UT +# Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center +# Please send comments and suggestions to SWPC.Webmaster@noaa.gov +# +# Units: Proton density p/cc +# Units: Bulk speed km/s +# Units: Ion tempeture degrees K +# Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data +# Missing data values: Density and Speed = -9999.9, Temp. = -1.00e+05 +# Source: ACE Satellite - Solar Wind Electron Proton Alpha Monitor +# +# 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma +# +# Modified Seconds ------------- Solar Wind ----------- +# UT Date Time Julian of the Proton Bulk Ion +# YR MO DA HHMM Day Day S Density Speed Temperature +#------------------------------------------------------------------------- +2024 05 06 1657 60436 61020 1 4.9 475.0 2.38e+05 +2024 05 06 1658 60436 61080 0 4.6 474.2 2.01e+05 +2024 05 06 1659 60436 61140 3 -9999.9 -9999.9 -1.00e+05 diff --git a/tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs b/tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs new file mode 100644 index 0000000..7bf6dbb --- /dev/null +++ b/tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs @@ -0,0 +1,49 @@ +using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Ace; + +/// +/// Unit tests for . +/// +public sealed class SolarWindPlasmaDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Ace/Samples/AceSwepamSample.txt")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = SolarWindPlasmaDataParser.Parse(text); + + // Assert + result.ShouldNotBeEmpty(); + result.ShouldBe([ + new SolarWindPlasmaRecord + ( + DateTime: new DateTime(2024, 5, 6, 16, 57, 0, DateTimeKind.Utc), + Status: 1, + ProtonDensity: 4.9f, + BulkSpeed: 475.0f, + IonTemperature: 2.38e+05f + ), + new SolarWindPlasmaRecord + ( + DateTime: new DateTime(2024, 5, 6, 16, 58, 0, DateTimeKind.Utc), + Status: 0, + ProtonDensity: 4.6f, + BulkSpeed: 474.2f, + IonTemperature: 2.01e+05f + ), + new SolarWindPlasmaRecord + ( + DateTime: new DateTime(2024, 5, 6, 16, 59, 0, DateTimeKind.Utc), + Status: 3, + ProtonDensity: null, + BulkSpeed: null, + IonTemperature: null + ) + ]); + } +} diff --git a/tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs b/tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs new file mode 100644 index 0000000..e91b1ba --- /dev/null +++ b/tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs @@ -0,0 +1,45 @@ +using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Dscovr; + +/// +/// Unit tests for . +/// +public sealed class MagnetometerDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Dscovr/Samples/DscovrMagnetometerSample.json")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = MagnetometerDataParser.Parse(text); + + // Assert + result.ShouldNotBeEmpty(); + result.ShouldBe([ + new MagnetometerRecord + ( + DateTime: new DateTime(2024, 5, 19, 17, 7, 0, DateTimeKind.Utc), + Bx: -2.15f, + By: 8.51f, + Bz: -2.98f, + Bt: 9.27f, + Latitude: -18.76f, + Longitude: 104.17f + ), + new MagnetometerRecord + ( + DateTime: new DateTime(2024, 5, 19, 17, 8, 0, DateTimeKind.Utc), + Bx: -2.38f, + By: 8.31f, + Bz: -3.24f, + Bt: 9.23f, + Latitude: -20.54f, + Longitude: 105.97f + ) + ]); + } +} diff --git a/tests/UnitTests/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json b/tests/UnitTests/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json new file mode 100644 index 0000000..9de4324 --- /dev/null +++ b/tests/UnitTests/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json @@ -0,0 +1,29 @@ +[ + [ + "time_tag", + "bx_gsm", + "by_gsm", + "bz_gsm", + "lon_gsm", + "lat_gsm", + "bt" + ], + [ + "2024-05-19 17:07:00.000", + "-2.15", + "8.51", + "-2.98", + "104.17", + "-18.76", + "9.27" + ], + [ + "2024-05-19 17:08:00.000", + "-2.38", + "8.31", + "-3.24", + "105.97", + "-20.54", + "9.23" + ] +] diff --git a/tests/UnitTests/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json b/tests/UnitTests/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json new file mode 100644 index 0000000..cb5af74 --- /dev/null +++ b/tests/UnitTests/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json @@ -0,0 +1,20 @@ +[ + [ + "time_tag", + "density", + "speed", + "temperature" + ], + [ + "2024-05-19 05:51:00.000", + "2.18", + "393.9", + "36967" + ], + [ + "2024-05-19 05:52:00.000", + "2.60", + "397.4", + "44618" + ] +] diff --git a/tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs b/tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs new file mode 100644 index 0000000..0de0620 --- /dev/null +++ b/tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs @@ -0,0 +1,39 @@ +using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Dscovr; + +/// +/// Unit tests for . +/// +public sealed class SolarWindPlasmaDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = SolarWindPlasmaDataParser.Parse(text); + + // Assert + result.ShouldNotBeEmpty(); + result.ShouldBe([ + new SolarWindPlasmaRecord + ( + DateTime: new DateTime(2024, 5, 19, 5, 51, 0, DateTimeKind.Utc), + ProtonDensity: 2.18f, + BulkSpeed: 393.9f, + IonTemperature: 36967f + ), + new SolarWindPlasmaRecord + ( + DateTime: new DateTime(2024, 5, 19, 5, 52, 0, DateTimeKind.Utc), + ProtonDensity: 2.60f, + BulkSpeed: 397.4f, + IonTemperature: 44618f + ) + ]); + } +} diff --git a/tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs b/tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs new file mode 100644 index 0000000..95635d6 --- /dev/null +++ b/tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs @@ -0,0 +1,50 @@ +using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; + +/// +/// Unit tests for . +/// +public sealed class KpIndex27DayDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = KpIndex27DayDataParser.Parse(text); + + // Assert + result.ShouldBe( + [ + new KpIndex27DayResponse + ( + Date: new DateOnly(2025, 1, 20), + KpIndex: 4 + ), + new KpIndex27DayResponse + ( + Date: new DateOnly(2025, 1, 21), + KpIndex: 3 + ), + new KpIndex27DayResponse + ( + Date: new DateOnly(2025, 1, 22), + KpIndex: 2 + ), + new KpIndex27DayResponse + ( + Date: new DateOnly(2025, 1, 23), + KpIndex: 2 + ), + new KpIndex27DayResponse + ( + Date: new DateOnly(2025, 1, 24), + KpIndex: 2 + ), + ]); + } +} diff --git a/tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs b/tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs new file mode 100644 index 0000000..0a75e58 --- /dev/null +++ b/tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs @@ -0,0 +1,50 @@ +using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; + +/// +/// Unit tests for . +/// +public sealed class KpIndex3DayDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = KpIndex3DayDataParser.Parse(text); + + // Assert + result.ShouldBe( + [ + new KpIndex3DayResponse + ( + DateTime: new DateTime(2025, 1, 18, 0, 0, 0), + KpIndex: 2.67F + ), + new KpIndex3DayResponse + ( + DateTime: new DateTime(2025, 1, 18, 3, 0, 0), + KpIndex: 2.00F + ), + new KpIndex3DayResponse + ( + DateTime: new DateTime(2025, 1, 18, 6, 0, 0), + KpIndex: 2.67F + ), + new KpIndex3DayResponse + ( + DateTime: new DateTime(2025, 1, 18, 9, 0, 0), + KpIndex: 2.00F + ), + new KpIndex3DayResponse + ( + DateTime: new DateTime(2025, 1, 18, 12, 0, 0), + KpIndex: 2.67F + ), + ]); + } +} diff --git a/tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs b/tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs new file mode 100644 index 0000000..39c4324 --- /dev/null +++ b/tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs @@ -0,0 +1,55 @@ +using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.UnitTests.Utils; +using Shouldly; + +namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; + +/// +/// Unit tests for . +/// +public sealed class KpIndexNowcastDataParserTests +{ + [Theory] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/KpIndex/Samples/KpIndexNowcastSample.json")] + public void Parse_WhenTextIsValid_ReturnsRecords(string text) + { + // Arrange, Act + var result = KpIndexNowcastDataParser.Parse(text); + + // Assert + result.ShouldBe( + [ + new KpIndexNowcastResponse + ( + DateTime: new DateTime(2025, 1, 18, 0, 0, 0), + KpIndex: 2.67F, + StationsCount: 8 + ), + new KpIndexNowcastResponse + ( + DateTime: new DateTime(2025, 1, 18, 3, 0, 0), + KpIndex: 2.00F, + StationsCount: 10 + ), + new KpIndexNowcastResponse + ( + DateTime: new DateTime(2025, 1, 18, 6, 0, 0), + KpIndex: 2.67F, + StationsCount: 8 + ), + new KpIndexNowcastResponse + ( + DateTime: new DateTime(2025, 1, 18, 9, 0, 0), + KpIndex: 2.00F, + StationsCount: 8 + ), + new KpIndexNowcastResponse + ( + DateTime: new DateTime(2025, 1, 18, 12, 0, 0), + KpIndex: 2.67F, + StationsCount: 9 + ), + ]); + } +} diff --git a/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt b/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt new file mode 100644 index 0000000..470615b --- /dev/null +++ b/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt @@ -0,0 +1,18 @@ +:Product: 27-day Space Weather Outlook Table 27DO.txt +:Issued: 2025 Jan 20 0136 UTC +# Prepared by the US Dept. of Commerce, NOAA, Space Weather Prediction Center +# Product description and SWPC contact on the Web +# https://www.swpc.noaa.gov/content/subscription-services +# +# 27-day Space Weather Outlook Table +# Issued 2025-01-20 +# +# UTC Radio Flux Planetary Largest +# Date 10.7 cm A Index Kp Index +2025 Jan 20 235 12 4 +2025 Jan 21 235 8 3 +2025 Jan 22 235 5 2 +2025 Jan 23 230 5 2 +2025 Jan 24 230 5 2 + + diff --git a/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json b/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json new file mode 100644 index 0000000..16cc09f --- /dev/null +++ b/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json @@ -0,0 +1,8 @@ +[ + ["time_tag","kp","observed","noaa_scale"], + ["2025-01-18 00:00:00","2.67","observed",null], + ["2025-01-18 03:00:00","2.00","observed",null], + ["2025-01-18 06:00:00","2.67","observed",null], + ["2025-01-18 09:00:00","2.00","observed",null], + ["2025-01-18 12:00:00","2.67","observed",null] +] diff --git a/tests/UnitTests/Noaa/KpIndex/Samples/KpIndexNowcastSample.json b/tests/UnitTests/Noaa/KpIndex/Samples/KpIndexNowcastSample.json new file mode 100644 index 0000000..4b376f3 --- /dev/null +++ b/tests/UnitTests/Noaa/KpIndex/Samples/KpIndexNowcastSample.json @@ -0,0 +1,8 @@ +[ + ["time_tag","Kp","a_running","station_count"], + ["2025-01-18 00:00:00.000","2.67","12","8"], + ["2025-01-18 03:00:00.000","2.00","7","10"], + ["2025-01-18 06:00:00.000","2.67","12","8"], + ["2025-01-18 09:00:00.000","2.00","7","8"], + ["2025-01-18 12:00:00.000","2.67","12","9"] +] diff --git a/tests/UnitTests/UnitTests.csproj b/tests/UnitTests/UnitTests.csproj new file mode 100644 index 0000000..615e501 --- /dev/null +++ b/tests/UnitTests/UnitTests.csproj @@ -0,0 +1,19 @@ + + + + Exe + AuroraScienceHub.Integrations.UnitTests + true + + + + + + + + + + + + + diff --git a/tests/UnitTests/Usings.cs b/tests/UnitTests/Usings.cs new file mode 100644 index 0000000..c802f44 --- /dev/null +++ b/tests/UnitTests/Usings.cs @@ -0,0 +1 @@ +global using Xunit; diff --git a/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs b/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs new file mode 100644 index 0000000..d7e97be --- /dev/null +++ b/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs @@ -0,0 +1,46 @@ +// Source code from: https://patriksvensson.se/posts/2017/11/using-embedded-resources-in-xunit-tests + +using System.Reflection; +using Xunit.Sdk; +using Xunit.v3; + +namespace AuroraScienceHub.Integrations.UnitTests.Utils; + +/// +/// Attribute to load test data from embedded resources. +/// +public sealed class EmbeddedResourceDataAttribute : DataAttribute +{ + private readonly string[] _args; + + public EmbeddedResourceDataAttribute(params string[] args) + { + _args = args; + } + + public override ValueTask> GetData(MethodInfo testMethod, DisposalTracker disposalTracker) + { + var result = new object[_args.Length]; + for (var index = 0; index < _args.Length; index++) + { + result[index] = ReadManifestData(_args[index]); + } + return new ValueTask>([new TheoryDataRow(result)]); + } + + private static string ReadManifestData(string resourceName) + { + var assembly = typeof(EmbeddedResourceDataAttribute).GetTypeInfo().Assembly; + resourceName = resourceName.Replace("/", "."); + using var stream = assembly.GetManifestResourceStream(resourceName); + if (stream == null) + { + throw new InvalidOperationException("Could not load manifest resource stream."); + } + + using var reader = new StreamReader(stream); + return reader.ReadToEnd(); + } + + public override bool SupportsDiscoveryEnumeration() => true; +} From 26e64c2018a50b750cf2734390cf4f0e07040c3d Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:09:24 +0300 Subject: [PATCH 02/19] Update README to reflect project name change and new focus on NOAA integrations --- README.md | 71 ++++----------- src/ExternalResources/Ace/AceClient.cs | 40 --------- .../Ace/Extensions/MagnetometerDataParser.cs | 67 -------------- .../Extensions/SolarWindPlasmaDataParser.cs | 70 --------------- src/ExternalResources/Ace/IAceClient.cs | 19 ---- .../Ace/Responses/MagnetometerRecord.cs | 22 ----- .../Ace/Responses/SolarWindPlasmaRecord.cs | 17 ---- src/ExternalResources/Dscovr/DscovrClient.cs | 72 --------------- .../Extensions/MagnetometerDataParser.cs | 90 ------------------- .../Extensions/SolarWindPlasmaDataParser.cs | 84 ----------------- src/ExternalResources/Dscovr/IDscovrClient.cs | 49 ---------- .../Dscovr/Responses/MagnetometerRecord.cs | 20 ----- .../Dscovr/Responses/SolarWindPlasmaRecord.cs | 15 ---- .../ExternalResources.csproj | 14 --- .../Infrastructure/ApiResource.cs | 28 ------ .../Configuration/AariGeophysClientBase.cs | 36 -------- .../Configuration/AariGeophysClientOptions.cs | 17 ---- .../Configuration/NoaaClientOptions.cs | 12 --- .../Extensions/KpIndex27DayDataParser.cs | 83 ----------------- .../Extensions/KpIndex3DayDataParser.cs | 75 ---------------- .../Extensions/KpIndexNowcastDataParser.cs | 82 ----------------- .../KpIndex/IKpIndexClient.cs | 24 ----- .../KpIndex/KpIndexClient.cs | 50 ----------- .../KpIndex/Responses/KpIndex27DayResponse.cs | 10 --- .../KpIndex/Responses/KpIndex3DayResponse.cs | 8 -- .../Responses/KpIndexNowcastResponse.cs | 12 --- .../PcIndex/Extensions/PcIndexDataParser.cs | 66 -------------- .../PcIndex/IPcIndexClient.cs | 19 ---- .../PcIndex/PcIndexClient.cs | 34 ------- .../PcIndex/Responses/PcIndexResponse.cs | 8 -- .../ServiceCollectionExtensions.cs | 26 ------ 31 files changed, 18 insertions(+), 1222 deletions(-) delete mode 100644 src/ExternalResources/Ace/AceClient.cs delete mode 100644 src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs delete mode 100644 src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs delete mode 100644 src/ExternalResources/Ace/IAceClient.cs delete mode 100644 src/ExternalResources/Ace/Responses/MagnetometerRecord.cs delete mode 100644 src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs delete mode 100644 src/ExternalResources/Dscovr/DscovrClient.cs delete mode 100644 src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs delete mode 100644 src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs delete mode 100644 src/ExternalResources/Dscovr/IDscovrClient.cs delete mode 100644 src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs delete mode 100644 src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs delete mode 100644 src/ExternalResources/ExternalResources.csproj delete mode 100644 src/ExternalResources/Infrastructure/ApiResource.cs delete mode 100644 src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs delete mode 100644 src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs delete mode 100644 src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs delete mode 100644 src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs delete mode 100644 src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs delete mode 100644 src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs delete mode 100644 src/ExternalResources/KpIndex/IKpIndexClient.cs delete mode 100644 src/ExternalResources/KpIndex/KpIndexClient.cs delete mode 100644 src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs delete mode 100644 src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs delete mode 100644 src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs delete mode 100644 src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs delete mode 100644 src/ExternalResources/PcIndex/IPcIndexClient.cs delete mode 100644 src/ExternalResources/PcIndex/PcIndexClient.cs delete mode 100644 src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs delete mode 100644 src/ExternalResources/ServiceCollectionExtensions.cs diff --git a/README.md b/README.md index cf3b1f9..1aa1abc 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,18 @@
- Aurora Science Hub Framework + Aurora Science Hub Integrations
diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj index f544fea..11e3240 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/AuroraScienceHub.Integrations.Benchmarks.csproj @@ -9,10 +9,9 @@ - - - - + + + @@ -20,7 +19,7 @@ - + diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs similarity index 81% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs index a6b8f3c..2996c47 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceMagnetometerDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs @@ -1,7 +1,7 @@ -using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; using BenchmarkDotNet.Attributes; -namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace; +namespace AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Ace; /// /// Benchmarks for (ACE). @@ -9,7 +9,7 @@ namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace; [MemoryDiagnoser(false)] public class AceMagnetometerDataParserBenchmark { - const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace.Samples.AceMagnetometerSample.txt"; + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Ace.Samples.AceMagnetometerSample.txt"; private string _text = string.Empty; diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs similarity index 73% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs index d0d82c6..f3b2b99 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/AceSolarWindPlasmaDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs @@ -1,7 +1,7 @@ -using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; using BenchmarkDotNet.Attributes; -namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace; +namespace AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Ace; /// /// Benchmarks for (ACE). @@ -9,14 +9,14 @@ namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace; [MemoryDiagnoser(false)] public class AceSolarWindPlasmaDataParserBenchmark { - const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Ace.Samples.AceSwepamSample.txt"; + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Ace.Samples.AceSwepamSample.txt"; private string _text = string.Empty; [GlobalSetup] public async Task Setup() { - await using var stream = typeof(AceMagnetometerDataParserBenchmark).Assembly + await using var stream = typeof(AceSolarWindPlasmaDataParserBenchmark).Assembly .GetManifestResourceStream(ResourceName) ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); using var reader = new StreamReader(stream); diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceMagnetometerSample.txt b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/Samples/AceMagnetometerSample.txt similarity index 100% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceMagnetometerSample.txt rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/Samples/AceMagnetometerSample.txt diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceSwepamSample.txt b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/Samples/AceSwepamSample.txt similarity index 100% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Ace/Samples/AceSwepamSample.txt rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/Samples/AceSwepamSample.txt diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs similarity index 80% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs index 34dcc8e..ddf0546 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrMagnetometerDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs @@ -1,7 +1,7 @@ -using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; using BenchmarkDotNet.Attributes; -namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr; +namespace AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Dscovr; /// /// Benchmarks for (DSCOVR). @@ -9,7 +9,7 @@ namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr; [MemoryDiagnoser(false)] public class DscovrMagnetometerDataParserBenchmark { - const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr.Samples.DscovrMagnetometerSample.json"; + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Dscovr.Samples.DscovrMagnetometerSample.json"; private string _text = string.Empty; diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs similarity index 72% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs index 5938e01..428b2b5 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs @@ -1,7 +1,7 @@ -using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; using BenchmarkDotNet.Attributes; -namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr; +namespace AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Dscovr; /// /// Benchmarks for (DSCOVR). @@ -9,14 +9,14 @@ namespace AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr; [MemoryDiagnoser(false)] public class DscovrSolarWindPlasmaDataParserBenchmark { - const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.Noaa.Dscovr.Samples.DscovrSolarWindPlasmaSample.json"; + const string ResourceName = "AuroraScienceHub.Integrations.Benchmarks.NoaaClient.Dscovr.Samples.DscovrSolarWindPlasmaSample.json"; private string _text = string.Empty; [GlobalSetup] public async Task Setup() { - await using var stream = typeof(DscovrMagnetometerDataParserBenchmark).Assembly + await using var stream = typeof(DscovrSolarWindPlasmaDataParserBenchmark).Assembly .GetManifestResourceStream(ResourceName) ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); using var reader = new StreamReader(stream); diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/Samples/DscovrMagnetometerSample.json similarity index 100% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/Samples/DscovrMagnetometerSample.json diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/Samples/DscovrSolarWindPlasmaSample.json similarity index 100% rename from benchmarks/AuroraScienceHub.Integrations.Benchmarks/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json rename to benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/Samples/DscovrSolarWindPlasmaSample.json diff --git a/package.json b/package.json deleted file mode 100644 index 385cbce..0000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "madr": "^3.0.0" - } -} diff --git a/samples/NoaaClientSample/NoaaClientSample.csproj b/samples/NoaaClientSample/NoaaClientSample.csproj index 5a378dc..9161629 100644 --- a/samples/NoaaClientSample/NoaaClientSample.csproj +++ b/samples/NoaaClientSample/NoaaClientSample.csproj @@ -17,7 +17,7 @@ - + diff --git a/samples/NoaaClientSample/OutputFormatter.cs b/samples/NoaaClientSample/OutputFormatter.cs index f125fa9..792aa56 100644 --- a/samples/NoaaClientSample/OutputFormatter.cs +++ b/samples/NoaaClientSample/OutputFormatter.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; using Spectre.Console; -using AceMagnetometerRecord = AuroraScienceHub.Integrations.Noaa.Ace.Responses.MagnetometerRecord; -using DscovrMagnetometerRecord = AuroraScienceHub.Integrations.Noaa.Dscovr.Responses.MagnetometerRecord; -using AceSolarWindPlasmaRecord = AuroraScienceHub.Integrations.Noaa.Ace.Responses.SolarWindPlasmaRecord; -using DscovrSolarWindPlasmaRecord = AuroraScienceHub.Integrations.Noaa.Dscovr.Responses.SolarWindPlasmaRecord; +using AceMagnetometerRecord = AuroraScienceHub.Integrations.NoaaClient.Ace.Responses.MagnetometerRecord; +using DscovrMagnetometerRecord = AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses.MagnetometerRecord; +using AceSolarWindPlasmaRecord = AuroraScienceHub.Integrations.NoaaClient.Ace.Responses.SolarWindPlasmaRecord; +using DscovrSolarWindPlasmaRecord = AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses.SolarWindPlasmaRecord; namespace AuroraScienceHub.Integrations.Samples.NoaaClientSample; diff --git a/samples/NoaaClientSample/Program.cs b/samples/NoaaClientSample/Program.cs index b8d8f5d..2c10240 100644 --- a/samples/NoaaClientSample/Program.cs +++ b/samples/NoaaClientSample/Program.cs @@ -1,7 +1,7 @@ -using AuroraScienceHub.Integrations.Noaa; -using AuroraScienceHub.Integrations.Noaa.Ace; -using AuroraScienceHub.Integrations.Noaa.Dscovr; -using AuroraScienceHub.Integrations.Noaa.KpIndex; +using AuroraScienceHub.Integrations.NoaaClient; +using AuroraScienceHub.Integrations.NoaaClient.Ace; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex; using AuroraScienceHub.Integrations.Samples.NoaaClientSample; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; diff --git a/samples/NoaaClientSample/README.md b/samples/NoaaClientSample/README.md index 2c0e487..925e01c 100644 --- a/samples/NoaaClientSample/README.md +++ b/samples/NoaaClientSample/README.md @@ -21,20 +21,20 @@ This sample demonstrates all available NOAA client methods through an interactiv ## Features -✨ **Interactive Menu** - Easy-to-use selection interface powered by Spectre.Console +**Interactive Menu** - Easy-to-use selection interface powered by Spectre.Console -📊 **Formatted Tables** - Beautiful table output with colors and borders +**Formatted Tables** - Beautiful table output with colors and borders -🎨 **Activity Levels** - KP index displayed with color-coded activity levels: +**Activity Levels** - KP index displayed with color-coded activity levels: - Low (0-2) - Green - Moderate (3-4) - Yellow - Elevated (5-6) - Orange - High (7-8) - Red - Extreme (9+) - Bold Red -⚡ **Bulk Execution** - Execute all API requests with a single menu option +**Bulk Execution** - Execute all API requests with a single menu option -🔄 **Loading Indicators** - Visual feedback with spinners and progress bars +**Loading Indicators** - Visual feedback with spinners and progress bars ## Requirements diff --git a/src/Noaa/Noaa.csproj b/src/Noaa/Noaa.csproj deleted file mode 100644 index 54dbf46..0000000 --- a/src/Noaa/Noaa.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - AuroraScienceHub.Integrations.Noaa - - - - - - - - - - diff --git a/src/Noaa/Ace/AceClient.cs b/src/NoaaClient/Ace/AceClient.cs similarity index 88% rename from src/Noaa/Ace/AceClient.cs rename to src/NoaaClient/Ace/AceClient.cs index 0831a86..7c0751b 100644 --- a/src/Noaa/Ace/AceClient.cs +++ b/src/NoaaClient/Ace/AceClient.cs @@ -1,8 +1,8 @@ -using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; -using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; using Microsoft.Extensions.Options; -namespace AuroraScienceHub.Integrations.Noaa.Ace; +namespace AuroraScienceHub.Integrations.NoaaClient.Ace; internal sealed class AceClient : IAceClient { diff --git a/src/Noaa/Ace/Extensions/MagnetometerDataParser.cs b/src/NoaaClient/Ace/Extensions/MagnetometerDataParser.cs similarity index 95% rename from src/Noaa/Ace/Extensions/MagnetometerDataParser.cs rename to src/NoaaClient/Ace/Extensions/MagnetometerDataParser.cs index 41897a1..3ca0201 100644 --- a/src/Noaa/Ace/Extensions/MagnetometerDataParser.cs +++ b/src/NoaaClient/Ace/Extensions/MagnetometerDataParser.cs @@ -1,7 +1,7 @@ using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; -namespace AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; // ACE Magnetometer data example: // # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data diff --git a/src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs b/src/NoaaClient/Ace/Extensions/SolarWindPlasmaDataParser.cs similarity index 95% rename from src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs rename to src/NoaaClient/Ace/Extensions/SolarWindPlasmaDataParser.cs index 3d7b9cc..05ac4a7 100644 --- a/src/Noaa/Ace/Extensions/SolarWindPlasmaDataParser.cs +++ b/src/NoaaClient/Ace/Extensions/SolarWindPlasmaDataParser.cs @@ -1,7 +1,7 @@ using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; -namespace AuroraScienceHub.Integrations.Noaa.Ace.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; // # 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma // # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data diff --git a/src/Noaa/Ace/IAceClient.cs b/src/NoaaClient/Ace/IAceClient.cs similarity index 79% rename from src/Noaa/Ace/IAceClient.cs rename to src/NoaaClient/Ace/IAceClient.cs index 06ab9b0..1d10d15 100644 --- a/src/Noaa/Ace/IAceClient.cs +++ b/src/NoaaClient/Ace/IAceClient.cs @@ -1,6 +1,6 @@ -using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; -namespace AuroraScienceHub.Integrations.Noaa.Ace; +namespace AuroraScienceHub.Integrations.NoaaClient.Ace; /// /// ACE Spacecraft client diff --git a/src/Noaa/Ace/Responses/MagnetometerRecord.cs b/src/NoaaClient/Ace/Responses/MagnetometerRecord.cs similarity index 91% rename from src/Noaa/Ace/Responses/MagnetometerRecord.cs rename to src/NoaaClient/Ace/Responses/MagnetometerRecord.cs index f57c45b..f4653d9 100644 --- a/src/Noaa/Ace/Responses/MagnetometerRecord.cs +++ b/src/NoaaClient/Ace/Responses/MagnetometerRecord.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.Ace.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; /// /// 1-minute averaged Real-time Interplanetary Magnetic Field Values diff --git a/src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs b/src/NoaaClient/Ace/Responses/SolarWindPlasmaRecord.cs similarity index 90% rename from src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs rename to src/NoaaClient/Ace/Responses/SolarWindPlasmaRecord.cs index 189243b..793f3a9 100644 --- a/src/Noaa/Ace/Responses/SolarWindPlasmaRecord.cs +++ b/src/NoaaClient/Ace/Responses/SolarWindPlasmaRecord.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.Ace.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; /// /// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma diff --git a/src/Noaa/Dscovr/DscovrClient.cs b/src/NoaaClient/Dscovr/DscovrClient.cs similarity index 95% rename from src/Noaa/Dscovr/DscovrClient.cs rename to src/NoaaClient/Dscovr/DscovrClient.cs index fcecc69..7b1a737 100644 --- a/src/Noaa/Dscovr/DscovrClient.cs +++ b/src/NoaaClient/Dscovr/DscovrClient.cs @@ -1,8 +1,8 @@ -using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; -using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; using Microsoft.Extensions.Options; -namespace AuroraScienceHub.Integrations.Noaa.Dscovr; +namespace AuroraScienceHub.Integrations.NoaaClient.Dscovr; internal sealed class DscovrClient : IDscovrClient { diff --git a/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs b/src/NoaaClient/Dscovr/Extensions/MagnetometerDataParser.cs similarity index 95% rename from src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs rename to src/NoaaClient/Dscovr/Extensions/MagnetometerDataParser.cs index 0ee7c86..35625f3 100644 --- a/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs +++ b/src/NoaaClient/Dscovr/Extensions/MagnetometerDataParser.cs @@ -1,8 +1,8 @@ using System.Text.Json; using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; -namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; // DSCOVR Magnetometer data example: // [ diff --git a/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs b/src/NoaaClient/Dscovr/Extensions/SolarWindPlasmaDataParser.cs similarity index 95% rename from src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs rename to src/NoaaClient/Dscovr/Extensions/SolarWindPlasmaDataParser.cs index 422bf99..6f121cd 100644 --- a/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs +++ b/src/NoaaClient/Dscovr/Extensions/SolarWindPlasmaDataParser.cs @@ -1,8 +1,8 @@ using System.Text.Json; using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; -namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; // DSCOVR Solar wind plasma data example: // [ diff --git a/src/Noaa/Dscovr/IDscovrClient.cs b/src/NoaaClient/Dscovr/IDscovrClient.cs similarity index 93% rename from src/Noaa/Dscovr/IDscovrClient.cs rename to src/NoaaClient/Dscovr/IDscovrClient.cs index 59391f3..71f5726 100644 --- a/src/Noaa/Dscovr/IDscovrClient.cs +++ b/src/NoaaClient/Dscovr/IDscovrClient.cs @@ -1,6 +1,6 @@ -using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; -namespace AuroraScienceHub.Integrations.Noaa.Dscovr; +namespace AuroraScienceHub.Integrations.NoaaClient.Dscovr; /// /// DSCOVR Spacecraft client diff --git a/src/Noaa/Dscovr/Responses/MagnetometerRecord.cs b/src/NoaaClient/Dscovr/Responses/MagnetometerRecord.cs similarity index 90% rename from src/Noaa/Dscovr/Responses/MagnetometerRecord.cs rename to src/NoaaClient/Dscovr/Responses/MagnetometerRecord.cs index 6d6876a..6ef18b7 100644 --- a/src/Noaa/Dscovr/Responses/MagnetometerRecord.cs +++ b/src/NoaaClient/Dscovr/Responses/MagnetometerRecord.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; /// /// 1-minute averaged Real-time Interplanetary Magnetic Field Values (DSCOVR) diff --git a/src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs b/src/NoaaClient/Dscovr/Responses/SolarWindPlasmaRecord.cs similarity index 87% rename from src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs rename to src/NoaaClient/Dscovr/Responses/SolarWindPlasmaRecord.cs index d9b1248..9659fd0 100644 --- a/src/Noaa/Dscovr/Responses/SolarWindPlasmaRecord.cs +++ b/src/NoaaClient/Dscovr/Responses/SolarWindPlasmaRecord.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; /// /// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma (DSCOVR) diff --git a/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs b/src/NoaaClient/KpIndex/Extensions/KpIndex27DayDataParser.cs similarity index 95% rename from src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs rename to src/NoaaClient/KpIndex/Extensions/KpIndex27DayDataParser.cs index 414f6d6..10fd385 100644 --- a/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs +++ b/src/NoaaClient/KpIndex/Extensions/KpIndex27DayDataParser.cs @@ -1,9 +1,9 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; -namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; // 27-day KP-index forecast data example: // :Product: 27-day Space Weather Outlook Table 27DO.txt diff --git a/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs b/src/NoaaClient/KpIndex/Extensions/KpIndex3DayDataParser.cs similarity index 93% rename from src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs rename to src/NoaaClient/KpIndex/Extensions/KpIndex3DayDataParser.cs index 8867d3f..2bb75d6 100644 --- a/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs +++ b/src/NoaaClient/KpIndex/Extensions/KpIndex3DayDataParser.cs @@ -1,9 +1,9 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text.Json; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; -namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; // 3-day KP-index forecast data example: // [ diff --git a/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs b/src/NoaaClient/KpIndex/Extensions/KpIndexNowcastDataParser.cs similarity index 94% rename from src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs rename to src/NoaaClient/KpIndex/Extensions/KpIndexNowcastDataParser.cs index 1fbbaeb..17fe110 100644 --- a/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs +++ b/src/NoaaClient/KpIndex/Extensions/KpIndexNowcastDataParser.cs @@ -1,9 +1,9 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text.Json; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; -namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; // Current KP-index forecast data example: // [ diff --git a/src/Noaa/KpIndex/IKpIndexClient.cs b/src/NoaaClient/KpIndex/IKpIndexClient.cs similarity index 83% rename from src/Noaa/KpIndex/IKpIndexClient.cs rename to src/NoaaClient/KpIndex/IKpIndexClient.cs index 2e28582..25b444b 100644 --- a/src/Noaa/KpIndex/IKpIndexClient.cs +++ b/src/NoaaClient/KpIndex/IKpIndexClient.cs @@ -1,6 +1,6 @@ -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; -namespace AuroraScienceHub.Integrations.Noaa.KpIndex; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex; /// /// KP-index client diff --git a/src/Noaa/KpIndex/KpIndexClient.cs b/src/NoaaClient/KpIndex/KpIndexClient.cs similarity index 90% rename from src/Noaa/KpIndex/KpIndexClient.cs rename to src/NoaaClient/KpIndex/KpIndexClient.cs index ae14f8f..943be75 100644 --- a/src/Noaa/KpIndex/KpIndexClient.cs +++ b/src/NoaaClient/KpIndex/KpIndexClient.cs @@ -1,8 +1,8 @@ -using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; using Microsoft.Extensions.Options; -namespace AuroraScienceHub.Integrations.Noaa.KpIndex; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex; internal sealed class KpIndexClient : IKpIndexClient { diff --git a/src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs b/src/NoaaClient/KpIndex/Responses/KpIndex27DayResponse.cs similarity index 76% rename from src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs rename to src/NoaaClient/KpIndex/Responses/KpIndex27DayResponse.cs index ce4cfaf..7f6322f 100644 --- a/src/Noaa/KpIndex/Responses/KpIndex27DayResponse.cs +++ b/src/NoaaClient/KpIndex/Responses/KpIndex27DayResponse.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; /// /// 27-day KP-index data diff --git a/src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs b/src/NoaaClient/KpIndex/Responses/KpIndex3DayResponse.cs similarity index 77% rename from src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs rename to src/NoaaClient/KpIndex/Responses/KpIndex3DayResponse.cs index a83ee4a..d964ad5 100644 --- a/src/Noaa/KpIndex/Responses/KpIndex3DayResponse.cs +++ b/src/NoaaClient/KpIndex/Responses/KpIndex3DayResponse.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; /// /// 3-day KP-index data diff --git a/src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs b/src/NoaaClient/KpIndex/Responses/KpIndexNowcastResponse.cs similarity index 83% rename from src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs rename to src/NoaaClient/KpIndex/Responses/KpIndexNowcastResponse.cs index 08a5c75..2249e05 100644 --- a/src/Noaa/KpIndex/Responses/KpIndexNowcastResponse.cs +++ b/src/NoaaClient/KpIndex/Responses/KpIndexNowcastResponse.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +namespace AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; /// /// Current KP-index data diff --git a/src/NoaaClient/NoaaClient.csproj b/src/NoaaClient/NoaaClient.csproj new file mode 100644 index 0000000..785fbc0 --- /dev/null +++ b/src/NoaaClient/NoaaClient.csproj @@ -0,0 +1,23 @@ + + + + AuroraScienceHub.Integrations.NoaaClient + AuroraScienceHub.Integrations.NoaaClient + NOAA space weather data integration client for ACE, DSCOVR spacecraft and KP-index data + + + + + + + + + + + + Provides unified HTTP client interfaces for accessing NOAA space weather data including solar wind measurements, magnetometer data, and geomagnetic activity indices from ACE and DSCOVR spacecraft with KP-index forecasts and nowcast data. + + noaa;space-weather;ace;dscovr;kp-index;solar-wind;magnetometer;geomagnetic;aurora;integration + + + diff --git a/src/Noaa/NoaaClientOptions.cs b/src/NoaaClient/NoaaClientOptions.cs similarity index 86% rename from src/Noaa/NoaaClientOptions.cs rename to src/NoaaClient/NoaaClientOptions.cs index 3d913b6..0f2ce28 100644 --- a/src/Noaa/NoaaClientOptions.cs +++ b/src/NoaaClient/NoaaClientOptions.cs @@ -1,4 +1,4 @@ -namespace AuroraScienceHub.Integrations.Noaa; +namespace AuroraScienceHub.Integrations.NoaaClient; /// /// NOAA client options @@ -8,7 +8,7 @@ public sealed class NoaaClientOptions /// /// Configuration option key /// - public const string OptionKey = "Noaa"; + public const string OptionKey = "NoaaClient"; private const string EmptyServerUrlMessage = $"Configuration value '{OptionKey}:{nameof(ServerUrl)}' is not set."; diff --git a/src/Noaa/README.md b/src/NoaaClient/README.md similarity index 100% rename from src/Noaa/README.md rename to src/NoaaClient/README.md diff --git a/src/Noaa/ServiceCollectionExtensions.cs b/src/NoaaClient/ServiceCollectionExtensions.cs similarity index 76% rename from src/Noaa/ServiceCollectionExtensions.cs rename to src/NoaaClient/ServiceCollectionExtensions.cs index 73c5643..a1b752a 100644 --- a/src/Noaa/ServiceCollectionExtensions.cs +++ b/src/NoaaClient/ServiceCollectionExtensions.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.Ace; -using AuroraScienceHub.Integrations.Noaa.Dscovr; -using AuroraScienceHub.Integrations.Noaa.KpIndex; +using AuroraScienceHub.Integrations.NoaaClient.Ace; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex; using Microsoft.Extensions.DependencyInjection; -namespace AuroraScienceHub.Integrations.Noaa; +namespace AuroraScienceHub.Integrations.NoaaClient; /// /// to register NOAA clients. diff --git a/tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs b/tests/UnitTests/NoaaClient/Ace/MagnetometerDataParserTests.cs similarity index 86% rename from tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs rename to tests/UnitTests/NoaaClient/Ace/MagnetometerDataParserTests.cs index 279b898..dee856a 100644 --- a/tests/UnitTests/Noaa/Ace/MagnetometerDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/Ace/MagnetometerDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; -using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Ace; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.Ace; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Ace; public sealed class MagnetometerDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Ace/Samples/AceMagnetometerSample.txt")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/Ace/Samples/AceMagnetometerSample.txt")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/Ace/Samples/AceMagnetometerSample.txt b/tests/UnitTests/NoaaClient/Ace/Samples/AceMagnetometerSample.txt similarity index 100% rename from tests/UnitTests/Noaa/Ace/Samples/AceMagnetometerSample.txt rename to tests/UnitTests/NoaaClient/Ace/Samples/AceMagnetometerSample.txt diff --git a/tests/UnitTests/Noaa/Ace/Samples/AceSwepamSample.txt b/tests/UnitTests/NoaaClient/Ace/Samples/AceSwepamSample.txt similarity index 100% rename from tests/UnitTests/Noaa/Ace/Samples/AceSwepamSample.txt rename to tests/UnitTests/NoaaClient/Ace/Samples/AceSwepamSample.txt diff --git a/tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs b/tests/UnitTests/NoaaClient/Ace/SolarWindPlasmaDataParserTests.cs similarity index 85% rename from tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs rename to tests/UnitTests/NoaaClient/Ace/SolarWindPlasmaDataParserTests.cs index 7bf6dbb..49c3438 100644 --- a/tests/UnitTests/Noaa/Ace/SolarWindPlasmaDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/Ace/SolarWindPlasmaDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.Ace.Extensions; -using AuroraScienceHub.Integrations.Noaa.Ace.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Ace.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Ace; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.Ace; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Ace; public sealed class SolarWindPlasmaDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Ace/Samples/AceSwepamSample.txt")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/Ace/Samples/AceSwepamSample.txt")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs b/tests/UnitTests/NoaaClient/Dscovr/MagnetometerDataParserTests.cs similarity index 81% rename from tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs rename to tests/UnitTests/NoaaClient/Dscovr/MagnetometerDataParserTests.cs index e91b1ba..f927dcd 100644 --- a/tests/UnitTests/Noaa/Dscovr/MagnetometerDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/Dscovr/MagnetometerDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; -using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Dscovr; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.Dscovr; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Dscovr; public sealed class MagnetometerDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Dscovr/Samples/DscovrMagnetometerSample.json")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/Dscovr/Samples/DscovrMagnetometerSample.json")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json b/tests/UnitTests/NoaaClient/Dscovr/Samples/DscovrMagnetometerSample.json similarity index 100% rename from tests/UnitTests/Noaa/Dscovr/Samples/DscovrMagnetometerSample.json rename to tests/UnitTests/NoaaClient/Dscovr/Samples/DscovrMagnetometerSample.json diff --git a/tests/UnitTests/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json b/tests/UnitTests/NoaaClient/Dscovr/Samples/DscovrSolarWindPlasmaSample.json similarity index 100% rename from tests/UnitTests/Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json rename to tests/UnitTests/NoaaClient/Dscovr/Samples/DscovrSolarWindPlasmaSample.json diff --git a/tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs b/tests/UnitTests/NoaaClient/Dscovr/SolarWindPlasmaDataParserTests.cs similarity index 80% rename from tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs rename to tests/UnitTests/NoaaClient/Dscovr/SolarWindPlasmaDataParserTests.cs index 0de0620..b64e7f9 100644 --- a/tests/UnitTests/Noaa/Dscovr/SolarWindPlasmaDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/Dscovr/SolarWindPlasmaDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.Dscovr.Extensions; -using AuroraScienceHub.Integrations.Noaa.Dscovr.Responses; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.Dscovr.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Dscovr; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.Dscovr; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.Dscovr; public sealed class SolarWindPlasmaDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/Dscovr/Samples/DscovrSolarWindPlasmaSample.json")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/Dscovr/Samples/DscovrSolarWindPlasmaSample.json")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs b/tests/UnitTests/NoaaClient/KpIndex/KpIndex27DayDataParserTests.cs similarity index 82% rename from tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs rename to tests/UnitTests/NoaaClient/KpIndex/KpIndex27DayDataParserTests.cs index 95635d6..53c7154 100644 --- a/tests/UnitTests/Noaa/KpIndex/KpIndex27DayDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/KpIndex/KpIndex27DayDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.KpIndex; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; public sealed class KpIndex27DayDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/KpIndex/Samples/KpIndex27DayForecastSample.txt")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs b/tests/UnitTests/NoaaClient/KpIndex/KpIndex3DayDataParserTests.cs similarity index 82% rename from tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs rename to tests/UnitTests/NoaaClient/KpIndex/KpIndex3DayDataParserTests.cs index 0a75e58..8d6844a 100644 --- a/tests/UnitTests/Noaa/KpIndex/KpIndex3DayDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/KpIndex/KpIndex3DayDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.KpIndex; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; public sealed class KpIndex3DayDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/KpIndex/Samples/KpIndex3DayForecastSample.json")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs b/tests/UnitTests/NoaaClient/KpIndex/KpIndexNowcastDataParserTests.cs similarity index 85% rename from tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs rename to tests/UnitTests/NoaaClient/KpIndex/KpIndexNowcastDataParserTests.cs index 39c4324..b3d4c94 100644 --- a/tests/UnitTests/Noaa/KpIndex/KpIndexNowcastDataParserTests.cs +++ b/tests/UnitTests/NoaaClient/KpIndex/KpIndexNowcastDataParserTests.cs @@ -1,9 +1,9 @@ -using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; -using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Extensions; +using AuroraScienceHub.Integrations.NoaaClient.KpIndex.Responses; using AuroraScienceHub.Integrations.UnitTests.Utils; using Shouldly; -namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; +namespace AuroraScienceHub.Integrations.UnitTests.NoaaClient.KpIndex; /// /// Unit tests for . @@ -11,7 +11,7 @@ namespace AuroraScienceHub.Integrations.UnitTests.Noaa.KpIndex; public sealed class KpIndexNowcastDataParserTests { [Theory] - [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.Noaa/KpIndex/Samples/KpIndexNowcastSample.json")] + [EmbeddedResourceData("AuroraScienceHub.Integrations.UnitTests.NoaaClient/KpIndex/Samples/KpIndexNowcastSample.json")] public void Parse_WhenTextIsValid_ReturnsRecords(string text) { // Arrange, Act diff --git a/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt b/tests/UnitTests/NoaaClient/KpIndex/Samples/KpIndex27DayForecastSample.txt similarity index 100% rename from tests/UnitTests/Noaa/KpIndex/Samples/KpIndex27DayForecastSample.txt rename to tests/UnitTests/NoaaClient/KpIndex/Samples/KpIndex27DayForecastSample.txt diff --git a/tests/UnitTests/Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json b/tests/UnitTests/NoaaClient/KpIndex/Samples/KpIndex3DayForecastSample.json similarity index 100% rename from tests/UnitTests/Noaa/KpIndex/Samples/KpIndex3DayForecastSample.json rename to tests/UnitTests/NoaaClient/KpIndex/Samples/KpIndex3DayForecastSample.json diff --git a/tests/UnitTests/Noaa/KpIndex/Samples/KpIndexNowcastSample.json b/tests/UnitTests/NoaaClient/KpIndex/Samples/KpIndexNowcastSample.json similarity index 100% rename from tests/UnitTests/Noaa/KpIndex/Samples/KpIndexNowcastSample.json rename to tests/UnitTests/NoaaClient/KpIndex/Samples/KpIndexNowcastSample.json diff --git a/tests/UnitTests/UnitTests.csproj b/tests/UnitTests/UnitTests.csproj index 615e501..b629956 100644 --- a/tests/UnitTests/UnitTests.csproj +++ b/tests/UnitTests/UnitTests.csproj @@ -7,13 +7,13 @@ - + - - - + + + diff --git a/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs b/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs index d7e97be..36e7151 100644 --- a/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs +++ b/tests/UnitTests/Utils/EmbeddedResourceDataAttribute.cs @@ -35,7 +35,7 @@ private static string ReadManifestData(string resourceName) using var stream = assembly.GetManifestResourceStream(resourceName); if (stream == null) { - throw new InvalidOperationException("Could not load manifest resource stream."); + throw new InvalidOperationException($"Could not load manifest resource stream: {resourceName}"); } using var reader = new StreamReader(stream); From 4c4152d26da9834d69a4eaf930ec8c79ce024366 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Wed, 4 Feb 2026 09:39:27 +0300 Subject: [PATCH 13/19] Refactor benchmark data parser setup to use IBenchmarksMarker for resource loading --- Directory.Build.props | 3 +-- .../IIntegrationsMarker.cs | 6 ++++++ .../NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs | 2 +- .../NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs | 2 +- .../Dscovr/DscovrMagnetometerDataParserBenchmark.cs | 2 +- .../Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 benchmarks/AuroraScienceHub.Integrations.Benchmarks/IIntegrationsMarker.cs diff --git a/Directory.Build.props b/Directory.Build.props index fe445b4..e32e1a8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,8 +10,7 @@ 9999 True True - $(NoWarn);NU5104 - + $(NoWarn) true diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/IIntegrationsMarker.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/IIntegrationsMarker.cs new file mode 100644 index 0000000..ce234d2 --- /dev/null +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/IIntegrationsMarker.cs @@ -0,0 +1,6 @@ +namespace AuroraScienceHub.Integrations.Benchmarks; + +/// +/// Marker interface for the Integrations benchmarks assembly. +/// +internal interface IBenchmarksMarker; diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs index 2996c47..57552ac 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceMagnetometerDataParserBenchmark.cs @@ -16,7 +16,7 @@ public class AceMagnetometerDataParserBenchmark [GlobalSetup] public async Task Setup() { - await using var stream = typeof(AceMagnetometerDataParserBenchmark).Assembly + await using var stream = typeof(IBenchmarksMarker).Assembly .GetManifestResourceStream(ResourceName) ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); using var reader = new StreamReader(stream); diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs index f3b2b99..a8322dc 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Ace/AceSolarWindPlasmaDataParserBenchmark.cs @@ -16,7 +16,7 @@ public class AceSolarWindPlasmaDataParserBenchmark [GlobalSetup] public async Task Setup() { - await using var stream = typeof(AceSolarWindPlasmaDataParserBenchmark).Assembly + await using var stream = typeof(IBenchmarksMarker).Assembly .GetManifestResourceStream(ResourceName) ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); using var reader = new StreamReader(stream); diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs index ddf0546..6cc1821 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrMagnetometerDataParserBenchmark.cs @@ -16,7 +16,7 @@ public class DscovrMagnetometerDataParserBenchmark [GlobalSetup] public async Task Setup() { - await using var stream = typeof(DscovrMagnetometerDataParserBenchmark).Assembly + await using var stream = typeof(IBenchmarksMarker).Assembly .GetManifestResourceStream(ResourceName) ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); using var reader = new StreamReader(stream); diff --git a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs index 428b2b5..b9647f4 100644 --- a/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs +++ b/benchmarks/AuroraScienceHub.Integrations.Benchmarks/NoaaClient/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs @@ -16,7 +16,7 @@ public class DscovrSolarWindPlasmaDataParserBenchmark [GlobalSetup] public async Task Setup() { - await using var stream = typeof(DscovrSolarWindPlasmaDataParserBenchmark).Assembly + await using var stream = typeof(IBenchmarksMarker).Assembly .GetManifestResourceStream(ResourceName) ?? throw new FileNotFoundException($"Resource '{ResourceName}' not found."); using var reader = new StreamReader(stream); From 8ae237cf88e18ad47129c5221426651ab41c79d4 Mon Sep 17 00:00:00 2001 From: alexander Date: Thu, 5 Feb 2026 20:24:02 +0300 Subject: [PATCH 14/19] + --- CHANGELOG.md | 51 +++++++++ Directory.Build.props | 14 +++ Integrations.slnx | 3 + README.md | 154 ++++++++++++++++++++++----- docs/ReleaseNotes_Integrations_v1.md | 105 ++++++++++++++++++ docs/logo/Fw_black.png | Bin 124625 -> 0 bytes docs/logo/Fw_icon.png | Bin 9647 -> 0 bytes docs/logo/Fw_white.png | Bin 120824 -> 0 bytes docs/logo/In_black.png | Bin 0 -> 115922 bytes docs/logo/In_icon.png | Bin 0 -> 8340 bytes docs/logo/In_white.png | Bin 0 -> 114718 bytes src/Directory.Build.props | 3 + 12 files changed, 302 insertions(+), 28 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 docs/ReleaseNotes_Integrations_v1.md delete mode 100644 docs/logo/Fw_black.png delete mode 100644 docs/logo/Fw_icon.png delete mode 100644 docs/logo/Fw_white.png create mode 100644 docs/logo/In_black.png create mode 100644 docs/logo/In_icon.png create mode 100644 docs/logo/In_white.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9d6bf4b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,51 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.0.0] - 2026-02-05 + +### Added + +#### NoaaClient Package +- **ACE Client** - Integration with Advanced Composition Explorer (ACE) satellite data + - Magnetometer data access with real-time measurements + - Solar Wind Plasma data (SWEPAM) with comprehensive particle measurements + - Strongly-typed response models for all data types + +- **DSCOVR Client** - Deep Space Climate Observatory (DSCOVR) satellite integration + - Magnetometer data with multiple time ranges (2H, 1D, 3D, 7D) + - Solar Wind Plasma data with flexible time window selection + - Unified interface consistent with ACE client + +- **KP-Index Client** - Geomagnetic activity index monitoring + - Real-time nowcast data access + - 3-day forecast with hourly resolution + - 27-day forecast for long-term planning + - Parsed and validated response models + +#### Core Features +- HTTP client implementations with dependency injection support +- Configuration through Options pattern +- Strongly-typed response models for all API endpoints +- Built on .NET 10.0 with latest C# features +- Comprehensive unit test coverage +- Performance benchmarks for data parsing operations + +#### Documentation +- Complete API documentation with usage examples +- Package-specific README files +- Sample application demonstrating all client capabilities +- XML documentation for all public APIs + +#### Development Infrastructure +- EditorConfig for consistent code style +- Automated code formatting with `dotnet format` +- Warnings treated as errors for code quality +- Embedded debug symbols in NuGet packages +- GitHub Actions CI/CD pipeline for build and test + +[1.0.0]: https://github.com/Aurora-Science-Hub/Integrations/releases/tag/1.0.0 + diff --git a/Directory.Build.props b/Directory.Build.props index e32e1a8..11916c9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -25,6 +25,20 @@ Copyright $(CurrentYear) © $(CompanyName). All rights reserved $(CompanyName) $(CompanyName) + Aurora Science Hub Integrations + https://github.com/Aurora-Science-Hub/Integrations + https://github.com/Aurora-Science-Hub/Integrations.git + git + + + + MIT + false + https://github.com/Aurora-Science-Hub/Integrations/blob/main/RELEASE_NOTES.md + true + true + true + snupkg diff --git a/Integrations.slnx b/Integrations.slnx index 2ac3239..06a7435 100644 --- a/Integrations.slnx +++ b/Integrations.slnx @@ -7,6 +7,9 @@ + + + diff --git a/README.md b/README.md index b0f433d..cc605ff 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@


- - - + +
Aurora Science Hub Integrations @@ -13,16 +12,24 @@ External data source integrations for space weather monitoring applications.

-[![](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/) -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) -[![Build & test](https://github.com/Aurora-Science-Hub/Integrations/actions/workflows/dotnet.yml/badge.svg)](https://github.com/Aurora-Science-Hub/Integrations/actions/workflows/dotnet.yml) +[![NuGet Version](https://img.shields.io/nuget/v/AuroraScienceHub.Integrations.NoaaClient?logo=nuget&label=NuGet)](https://www.nuget.org/packages/AuroraScienceHub.Integrations.NoaaClient/) +[![NuGet Downloads](https://img.shields.io/nuget/dt/AuroraScienceHub.Integrations.NoaaClient?logo=nuget&label=Downloads)](https://www.nuget.org/packages/AuroraScienceHub.Integrations.NoaaClient/) +[![](https://img.shields.io/badge/.NET-10.0-512BD4?logo=dotnet)](https://dotnet.microsoft.com/) +[![](https://img.shields.io/badge/C%23-13.0-239120?logo=csharp)](https://learn.microsoft.com/en-us/dotnet/csharp/) +
+[![Build & Test](https://github.com/Aurora-Science-Hub/Integrations/actions/workflows/dotnet.yml/badge.svg)](https://github.com/Aurora-Science-Hub/Integrations/actions/workflows/dotnet.yml) +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) +[![GitHub Stars](https://img.shields.io/github/stars/Aurora-Science-Hub/Integrations?style=social)](https://github.com/Aurora-Science-Hub/Integrations) +Getting StartedAvailable Packages • +ArchitectureDevelopmentCode StyleTestingLicense • -Contributing +Contributing • +Links @@ -32,35 +39,89 @@ All packages are distributed via NuGet and target **.NET 10.0**. Install individual packages as needed: ```bash -dotnet add package AuroraScienceHub.Integrations.Noaa -# ... other packages +dotnet add package AuroraScienceHub.Integrations.NoaaClient ``` -Each package provides HTTP clients for accessing external data sources with strongly-typed response models. +### Quick Example + +```csharp +// Register services +builder.Services.AddNoaaClients(); + +// Inject and use clients +public class SpaceWeatherService +{ + private readonly IAceClient _aceClient; + + public SpaceWeatherService(IAceClient aceClient) + { + _aceClient = aceClient; + } + + public async Task> GetMagnetometerDataAsync() + { + return await _aceClient.GetMagnetometerDataAsync(); + } +} +``` + +Each package provides HTTP clients for accessing external data sources with strongly-typed response models and full dependency injection support. ## Available Packages -### NOAA Integrations +### NOAA Space Weather Integrations + +**[AuroraScienceHub.Integrations.NoaaClient](src/NoaaClient/)** - Comprehensive NOAA Space Weather data access + +| Component | Description | +|-----------|-------------| +| **ACE Client** | Advanced Composition Explorer satellite data - magnetometer and SWEPAM measurements | +| **DSCOVR Client** | Deep Space Climate Observatory data - solar wind and magnetic field measurements with multiple time ranges (2H, 1D, 3D, 7D) | +| **KP-Index Client** | Geomagnetic activity indices - nowcast and forecast data (3-day and 27-day) | -- **[Noaa](src/Noaa/)** - NOAA Space Weather data source clients - - **ACE** - Advanced Composition Explorer satellite data - - **DSCOVR** - Deep Space Climate Observatory satellite data - - **Kp Index** - Geomagnetic activity index data +📖 See [detailed documentation](src/NoaaClient/README.md) for usage examples and API reference. ## Architecture -This repository provides HTTP clients for external space weather data sources: +This repository provides production-ready HTTP clients for external space weather data sources with the following characteristics: -- **Type-Safe Clients** - Strongly-typed HTTP clients with dependency injection support -- **Response Models** - Well-defined DTOs for all API responses -- **Configuration** - Options pattern for configuring API endpoints -- **Modern .NET** - Built on .NET 10 with latest C# features +- **Type-Safe Clients** - Strongly-typed HTTP clients with dependency injection support via `IHttpClientFactory` +- **Response Models** - Well-defined DTOs for all API responses with validation +- **Configuration** - Options pattern for configuring API endpoints and behavior +- **Modern .NET** - Built on .NET 10 with latest C# features and performance optimizations +- **Resilience** - Built-in retry policies and error handling +- **Testability** - Designed for easy unit testing with interface-based design + +### Design Principles + +- **Single Responsibility** - Each client focuses on a specific data source +- **Dependency Injection** - First-class DI support for ASP.NET Core and .NET applications +- **Performance** - Optimized parsing and minimal allocations +- **Extensibility** - Easy to extend with additional data sources ## Development ### Prerequisites -- .NET 10.0 SDK or later +- [.NET 10.0 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) or later +- IDE: [Visual Studio 2025+](https://visualstudio.microsoft.com/), [Rider 2025+](https://www.jetbrains.com/rider/), or [VS Code](https://code.visualstudio.com/) + +### Building from Source + +```bash +# Clone the repository +git clone https://github.com/Aurora-Science-Hub/Integrations.git +cd Integrations + +# Restore dependencies +dotnet restore + +# Build the solution +dotnet build + +# Run tests +dotnet test +``` ## Code Style @@ -86,25 +147,62 @@ dotnet format --verify-no-changes ## Testing -Unit tests are located in the `tests/UnitTests/` directory. The framework uses: +Unit tests are located in the `tests/UnitTests/` directory. + +### Test Framework + +- **xUnit** - Test execution framework +- **Moq** - Mocking library for unit tests +- **Embedded Resources** - Test data stored as embedded resources for reproducibility + +### Running Tests + +```bash +# Run all tests +dotnet test + +# Run tests with code coverage +dotnet test --collect:"XPlat Code Coverage" + +# Run tests in watch mode +dotnet watch test --project tests/UnitTests/UnitTests.csproj +``` + +### Test Coverage -- xUnit for test execution -- Moq for mocking +The project maintains comprehensive test coverage for all data parsers and client implementations, ensuring data integrity and API reliability. ## License -See [LICENSE](LICENSE) and [PackageLicenses.txt](PackageLicenses.txt) for details. +This project is licensed under the MIT License. See [LICENSE](LICENSE) file for details. ## Contributing -When contributing to this repository: +We welcome contributions! When contributing to this repository: 1. Follow the established code style (enforced by EditorConfig) 2. Run `dotnet format` before committing -3. Ensure all tests pass +3. Ensure all tests pass with `dotnet test` 4. Update relevant README files for your changes 5. Keep packages focused and loosely coupled +6. Add unit tests for new features + +### Reporting Issues + +Please report bugs and feature requests on the [GitHub Issues](https://github.com/Aurora-Science-Hub/Integrations/issues) page. + +## Links + +- **NuGet Package**: [AuroraScienceHub.Integrations.NoaaClient](https://www.nuget.org/packages/AuroraScienceHub.Integrations.NoaaClient/) +- **Source Code**: [GitHub Repository](https://github.com/Aurora-Science-Hub/Integrations) +- **Issue Tracker**: [GitHub Issues](https://github.com/Aurora-Science-Hub/Integrations/issues) +- **Changelog**: [CHANGELOG.md](CHANGELOG.md) +- **Release Notes**: [RELEASE_NOTES.md](RELEASE_NOTES.md) + +## Acknowledgments + +This project integrates data from the **NOAA Space Weather Prediction Center**. We thank NOAA and NASA for providing free and open access to space weather data. --- -**Note**: This project provides data source integrations for space weather monitoring application. +**Note**: This project provides data source integrations for space weather monitoring applications. diff --git a/docs/ReleaseNotes_Integrations_v1.md b/docs/ReleaseNotes_Integrations_v1.md new file mode 100644 index 0000000..5757a3a --- /dev/null +++ b/docs/ReleaseNotes_Integrations_v1.md @@ -0,0 +1,105 @@ +# Release Notes - Version 1.0.0 + +**Release Date:** February 5, 2026 + +## Initial Release + +We're excited to announce the first stable release of **Aurora Science Hub Integrations** - a comprehensive suite of .NET clients for accessing space weather data from NOAA data sources. + +## Available Packages + +### AuroraScienceHub.Integrations.NoaaClient v1.0.0 + +The flagship package providing seamless integration with NOAA Space Weather Prediction Center data sources. + +## Key Features + +### ACE Spacecraft Integration +Access real-time data from the Advanced Composition Explorer satellite positioned at the L1 Lagrange point: +- **Magnetometer Data** - Interplanetary magnetic field measurements (Bx, By, Bz components) +- **Solar Wind Plasma Data** - Comprehensive particle measurements including density, speed, and temperature + +### DSCOVR Spacecraft Integration +Retrieve data from the Deep Space Climate Observatory with flexible time ranges: +- **Multiple Time Windows** - 2-hour, 1-day, 3-day, and 7-day data access +- **Magnetometer Measurements** - High-precision magnetic field data +- **Solar Wind Parameters** - Critical inputs for space weather forecasting + +### KP-Index Data Access +Monitor and forecast geomagnetic activity with three specialized endpoints: +- **Nowcast** - Real-time geomagnetic activity observations +- **3-Day Forecast** - Short-term predictions with 3-hour resolution +- **27-Day Forecast** - Extended outlook for planning and analysis + +## Technical Highlights + +- **Built on .NET 10.0** - Leveraging the latest .NET features and performance improvements +- **Strongly-Typed APIs** - Compile-time safety with comprehensive response models +- **Dependency Injection** - Native support for ASP.NET Core and modern .NET applications +- **High Performance** - Optimized parsing algorithms validated through extensive benchmarking +- **Production Ready** - Comprehensive unit tests and real-world validation + +## Getting Started + +Install via NuGet: +```bash +dotnet add package AuroraScienceHub.Integrations.NoaaClient +``` + +Register services in your application: +```csharp +builder.Services.AddNoaaClients(); +``` + +Start accessing space weather data: +```csharp +// Inject clients via dependency injection +public class SpaceWeatherService +{ + private readonly IAceClient _aceClient; + private readonly IDscovrClient _dscovrClient; + private readonly IKpIndexClient _kpIndexClient; + + public SpaceWeatherService( + IAceClient aceClient, + IDscovrClient dscovrClient, + IKpIndexClient kpIndexClient) + { + _aceClient = aceClient; + _dscovrClient = dscovrClient; + _kpIndexClient = kpIndexClient; + } + + public async Task GetLatestDataAsync() + { + return await _aceClient.GetMagnetometerDataAsync(); + } +} +``` + +## Documentation + +- [Main README](README.md) - Repository overview and development guidelines +- [NoaaClient Documentation](src/NoaaClient/README.md) - Package-specific documentation +- [Sample Application](samples/NoaaClientSample/) - Complete working examples +- [CHANGELOG](CHANGELOG.md) - Detailed change history + +## Resources + +- **GitHub Repository:** https://github.com/Aurora-Science-Hub/Integrations +- **NuGet Package:** https://www.nuget.org/packages/AuroraScienceHub.Integrations.NoaaClient +- **Issue Tracker:** https://github.com/Aurora-Science-Hub/Integrations/issues +- **Discussions:** https://github.com/Aurora-Science-Hub/Integrations/discussions + +## Acknowledgments + +This project integrates data from the NOAA Space Weather Prediction Center. We are grateful to NOAA and NASA for providing free and open access to space weather data. + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +--- + +**Questions or feedback?** Open an issue on [GitHub](https://github.com/Aurora-Science-Hub/Integrations/issues) or start a [discussion](https://github.com/Aurora-Science-Hub/Integrations/discussions). + diff --git a/docs/logo/Fw_black.png b/docs/logo/Fw_black.png deleted file mode 100644 index e30fb2cb0de5707a11309da6f5023855bb6498ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124625 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 IM6N<$f-Nps4FCWD diff --git a/docs/logo/Fw_icon.png b/docs/logo/Fw_icon.png deleted file mode 100644 index 5e76ceaeee0ca1ec4b453d1932b27dc55a872d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9647 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 diff --git a/docs/logo/Fw_white.png b/docs/logo/Fw_white.png deleted file mode 100644 index 8811c2581c7d1e40ec64110ef4d6c505b4c14edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120824 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 z 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 AD*ylh diff --git a/docs/logo/In_black.png b/docs/logo/In_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec306b285fb519470b415c9b551f2e0a30557f9 GIT binary patch literal 115922 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 z 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

`7A&dd#6Y{J*G!QXA1O6S7O4Tx|Nb`3mpK9Km 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 literal 0 HcmV?d00001 diff --git a/docs/logo/In_icon.png b/docs/logo/In_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..204de9e508d4618df4a4dd408a4c3e47eb7b27e3 GIT binary patch literal 8340 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 Z2LpegzQGN<3-yQra$l6CswBXH{{yWrIkNx& literal 0 HcmV?d00001 diff --git a/docs/logo/In_white.png b/docs/logo/In_white.png new file mode 100644 index 0000000000000000000000000000000000000000..2094481018ea812320645eb08d37fa9e9f828562 GIT binary patch literal 114718 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 Fw_icon.png Copyright 2024-$([System.DateTime]::Now.ToString(yyyy)) Aurora Science Hub + false + en-US + en-US From a1d3139100f493c89277751610649331abd4790c Mon Sep 17 00:00:00 2001 From: alexander Date: Thu, 5 Feb 2026 20:28:32 +0300 Subject: [PATCH 15/19] + --- src/Directory.Build.props | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index e1f7ca1..c0b6b53 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -14,7 +14,7 @@ git MIT true - Fw_icon.png + In_icon.png Copyright 2024-$([System.DateTime]::Now.ToString(yyyy)) Aurora Science Hub false en-US @@ -22,8 +22,12 @@ - - + + + + + + From afd3cce249f413d1ede12df04656771226d3c5c8 Mon Sep 17 00:00:00 2001 From: alexander Date: Thu, 5 Feb 2026 20:32:52 +0300 Subject: [PATCH 16/19] + --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cc605ff..9654ae8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ +
Aurora Science Hub Integrations From d99ff779198e43e0bd8e900318ffca49545f1e1b Mon Sep 17 00:00:00 2001 From: alexander Date: Thu, 5 Feb 2026 20:56:50 +0300 Subject: [PATCH 17/19] + --- Directory.Build.props | 2 +- README.md | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 11916c9..024bffd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -42,7 +42,7 @@ - 10.0.0 + 1.0.0 diff --git a/README.md b/README.md index 9654ae8..9315e83 100644 --- a/README.md +++ b/README.md @@ -74,13 +74,13 @@ Each package provides HTTP clients for accessing external data sources with stro **[AuroraScienceHub.Integrations.NoaaClient](src/NoaaClient/)** - Comprehensive NOAA Space Weather data access -| Component | Description | -|-----------|-------------| -| **ACE Client** | Advanced Composition Explorer satellite data - magnetometer and SWEPAM measurements | -| **DSCOVR Client** | Deep Space Climate Observatory data - solar wind and magnetic field measurements with multiple time ranges (2H, 1D, 3D, 7D) | -| **KP-Index Client** | Geomagnetic activity indices - nowcast and forecast data (3-day and 27-day) | +| Component | Description | +|---------------------|-----------------------------------------------------------------------------------------------------------------------------| +| **ACE Client** | Advanced Composition Explorer satellite data - magnetometer and SWEPAM measurements | +| **DSCOVR Client** | Deep Space Climate Observatory data - solar wind and magnetic field measurements with multiple time ranges (2H, 1D, 3D, 7D) | +| **KP-Index Client** | Geomagnetic activity indices - nowcast and forecast data (3-day and 27-day) | -📖 See [detailed documentation](src/NoaaClient/README.md) for usage examples and API reference. +See [detailed documentation](src/NoaaClient/README.md) for usage examples and API reference. ## Architecture @@ -162,9 +162,6 @@ Unit tests are located in the `tests/UnitTests/` directory. # Run all tests dotnet test -# Run tests with code coverage -dotnet test --collect:"XPlat Code Coverage" - # Run tests in watch mode dotnet watch test --project tests/UnitTests/UnitTests.csproj ``` @@ -198,7 +195,7 @@ Please report bugs and feature requests on the [GitHub Issues](https://github.co - **Source Code**: [GitHub Repository](https://github.com/Aurora-Science-Hub/Integrations) - **Issue Tracker**: [GitHub Issues](https://github.com/Aurora-Science-Hub/Integrations/issues) - **Changelog**: [CHANGELOG.md](CHANGELOG.md) -- **Release Notes**: [RELEASE_NOTES.md](RELEASE_NOTES.md) +- **Release Notes**: [RELEASE_NOTES.md](docs/ReleaseNotes_Integrations_v1.md) ## Acknowledgments From 19f9a641346b72e532ac1dbc8693bfc3dfc815ed Mon Sep 17 00:00:00 2001 From: alexander Date: Thu, 5 Feb 2026 21:00:36 +0300 Subject: [PATCH 18/19] + --- Directory.Build.props | 14 -------------- src/Directory.Build.props | 3 --- 2 files changed, 17 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 024bffd..b16d8ca 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -25,20 +25,6 @@ Copyright $(CurrentYear) © $(CompanyName). All rights reserved $(CompanyName) $(CompanyName) - Aurora Science Hub Integrations - https://github.com/Aurora-Science-Hub/Integrations - https://github.com/Aurora-Science-Hub/Integrations.git - git - - - - MIT - false - https://github.com/Aurora-Science-Hub/Integrations/blob/main/RELEASE_NOTES.md - true - true - true - snupkg diff --git a/src/Directory.Build.props b/src/Directory.Build.props index c0b6b53..f435be9 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,9 +16,6 @@ true In_icon.png Copyright 2024-$([System.DateTime]::Now.ToString(yyyy)) Aurora Science Hub - false - en-US - en-US From 74668c9227e62fabded92312f761ed8c8ddeb86f Mon Sep 17 00:00:00 2001 From: alexander Date: Thu, 5 Feb 2026 21:01:43 +0300 Subject: [PATCH 19/19] + --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 9315e83..da1250f 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,3 @@ Please report bugs and feature requests on the [GitHub Issues](https://github.co ## Acknowledgments This project integrates data from the **NOAA Space Weather Prediction Center**. We thank NOAA and NASA for providing free and open access to space weather data. - ---- - -**Note**: This project provides data source integrations for space weather monitoring applications.

- A comprehensive collection of reusable infrastructure packages for building modern .NET 9 applications. + External data source integrations for space weather monitoring applications.

-[![](https://img.shields.io/badge/.NET-9.0-512BD4)](https://dotnet.microsoft.com/) -[![](https://img.shields.io/badge/C%23-13.0-239120)](https://learn.microsoft.com/en-us/dotnet/csharp/) -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Aurora-Science-Hub/Framework/blob/main/LICENSE) -[![Build & test](https://github.com/Aurora-Science-Hub/Framework/actions/workflows/dotnet.yml/badge.svg)](https://github.com/Aurora-Science-Hub/Framework/actions/workflows/dotnet.yml) +[![](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +[![Build & test](https://github.com/Aurora-Science-Hub/Integrations/actions/workflows/dotnet.yml/badge.svg)](https://github.com/Aurora-Science-Hub/Integrations/actions/workflows/dotnet.yml)
Available Packages • -ArchitectureDevelopmentCode StyleTesting • @@ -34,62 +32,29 @@ All packages are distributed via NuGet and target **.NET 9.0**. Install individual packages as needed: ```bash -dotnet add package AuroraScienceHub.Framework.Composition -dotnet add package AuroraScienceHub.Framework.AspNetCore -dotnet add package AuroraScienceHub.Framework.EntityFramework +dotnet add package AuroraScienceHub.Integrations.Noaa # ... other packages ``` -Each package includes its own README with detailed usage instructions and examples. +Each package provides HTTP clients for accessing external data sources with strongly-typed response models. ## Available Packages -### Core Infrastructure +### NOAA Integrations -- **[Composition](src/Composition/)** - Modular architecture framework with service and application modules -- **[Configuration](src/Configuration/)** - Type-safe configuration loading with validation -- **[Diagnostics](src/Diagnostics/)** - Health checks, application descriptors, and monitoring utilities -- **[Exceptions](src/Exceptions/)** - Common exception types and error handling patterns -- **[Utilities](src/Utilities/)** - General-purpose utility classes and extension methods - -### Web & API - -- **[AspNetCore](src/AspNetCore/)** - ASP.NET Core extensions, problem details, security, and routing -- **[Http](src/Http/)** - HTTP client utilities and extensions - -### Data Access - -- **[Entities](src/Entities/)** - Domain entity interfaces, strong-typed IDs, and DDD patterns -- **[EntityFramework](src/EntityFramework/)** - EF Core extensions with auditing, soft deletes, and migrations -- **[EntityFramework.NpgSql](src/EntityFramework.NpgSql/)** - PostgreSQL-specific DbContext factories and conventions -- **[ClickHouse](src/ClickHouse/)** - ClickHouse database integration - -### Caching & Performance - -- **[Caching](src/Caching/)** - Hybrid cache extensions and utilities - -### Logging & Observability - -- **[Logging.OpenTelemetry](src/Logging.OpenTelemetry/)** - OpenTelemetry integration for distributed tracing - -### AI & Machine Learning - -- **[Ai](src/Ai/)** - OpenAI GPT and DeepL translation service integrations -- **[Ocr](src/Ocr/)** - Optical Character Recognition utilities - -### Serialization - -- **[Json](src/Json/)** - JSON serialization extensions and converters +- **[Noaa](src/Noaa/)** - NOAA Space Weather data source clients + - **ACE** - Advanced Composition Explorer satellite data + - **DSCOVR** - Deep Space Climate Observatory satellite data + - **Kp Index** - Geomagnetic activity index data ## Architecture -The framework follows these principles: +This repository provides HTTP clients for external space weather data sources: -- **Modular Design** - Each package is self-contained and can be used independently -- **Clean Architecture** - Clear separation of concerns with minimal coupling -- **Domain-Driven Design** - Support for DDD patterns and practices -- **Type Safety** - Strong typing with nullable reference types enabled -- **Modern .NET** - Leverages latest .NET 9 features and patterns +- **Type-Safe Clients** - Strongly-typed HTTP clients with dependency injection support +- **Response Models** - Well-defined DTOs for all API responses +- **Configuration** - Options pattern for configuring API endpoints +- **Modern .NET** - Built on .NET 9 with latest C# features ## Development @@ -160,4 +125,4 @@ When contributing to this repository: --- -**Note**: This framework is designed for Aurora Science Hub applications but can be used in any modern .NET project requiring robust infrastructure components. +**Note**: This project provides data source integrations for the SWeather (Space Weather) monitoring application. diff --git a/src/ExternalResources/Ace/AceClient.cs b/src/ExternalResources/Ace/AceClient.cs deleted file mode 100644 index d86181e..0000000 --- a/src/ExternalResources/Ace/AceClient.cs +++ /dev/null @@ -1,40 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Extensions; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; -using Microsoft.Extensions.Options; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace; - -internal sealed class AceClient : IAceClient -{ - private readonly HttpClient _httpClient; - private readonly Uri _baseUrl; - - public AceClient( - HttpClient httpClient, - IOptions options) - { - _httpClient = httpClient; - _baseUrl = options.Value.RequiredServerUrl; - } - - public async Task> GetMagnetometerDataAsync(CancellationToken cancellationToken) - { - var url = new Uri(_baseUrl, "text/ace-magnetometer.txt"); - var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); - - return MagnetometerDataParser.Parse(text); - } - - public async Task> GetSwepamDataAsync(CancellationToken cancellationToken) - { - var url = new Uri(_baseUrl, "text/ace-swepam.txt"); - var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); - - return SolarWindPlasmaDataParser.Parse(text); - } -} diff --git a/src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs b/src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs deleted file mode 100644 index 25e5931..0000000 --- a/src/ExternalResources/Ace/Extensions/MagnetometerDataParser.cs +++ /dev/null @@ -1,67 +0,0 @@ -using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Extensions; - -// ACE Magnetometer data example: -// # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data -// # Missing data values: -999.9 -// # Modified Seconds -// # UT Date Time Julian of the ---------------- GSM Coordinates --------------- -// # YR MO DA HHMM Day Day S Bx By Bz Bt Lat. Long. -// #------------------------------------------------------------------------------------ -// 2024 05 05 0846 60435 31560 0 -0.7 -0.8 -1.9 2.2 -60.5 225.8 -internal static class MagnetometerDataParser -{ - private const string MissingDataValue = "-999.9"; - - public static IReadOnlyList Parse(string text) - { - var records = new List(); - var lines = text.SplitLines(); - Span fieldsRange = stackalloc Range[32]; - - foreach (var line in lines) - { - var trimmedLine = line.Line.Trim(); - if (trimmedLine.Length == 0 || trimmedLine[0] == '#') - { - continue; - } - var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - - // check if line contains data - if (rangesCount != 13 || !trimmedLine[fieldsRange[0]].IsParsableAsInt()) - { - continue; - } - - var record = new MagnetometerRecord - ( - DateTime: new DateTime( - year: trimmedLine[fieldsRange[0]].ParseIntInvariant(), - month: trimmedLine[fieldsRange[1]].ParseIntInvariant(), - day: trimmedLine[fieldsRange[2]].ParseIntInvariant(), - hour: trimmedLine[fieldsRange[3]][..2].ParseIntInvariant(), - minute: trimmedLine[fieldsRange[3]][2..].ParseIntInvariant(), - second: 0, - DateTimeKind.Utc), - Status: trimmedLine[fieldsRange[6]].ParseIntInvariant(), - Bx: GetFloatOrNull(trimmedLine[fieldsRange[7]]), - By: GetFloatOrNull(trimmedLine[fieldsRange[8]]), - Bz: GetFloatOrNull(trimmedLine[fieldsRange[9]]), - Bt: GetFloatOrNull(trimmedLine[fieldsRange[10]]), - Latitude: GetFloatOrNull(trimmedLine[fieldsRange[11]]), - Longitude: GetFloatOrNull(trimmedLine[fieldsRange[12]]) - ); - records.Add(record); - } - - return records; - } - - private static float? GetFloatOrNull(ReadOnlySpan value) - => value.SequenceEqual(MissingDataValue) - ? null - : value.ParseFloatInvariant(); -} diff --git a/src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs b/src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs deleted file mode 100644 index bd9ec45..0000000 --- a/src/ExternalResources/Ace/Extensions/SolarWindPlasmaDataParser.cs +++ /dev/null @@ -1,70 +0,0 @@ -using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Extensions; - -// # 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma -// # Status(S): 0 = nominal data, 1 to 8 = bad data record, 9 = no data -// # Missing data values: Density and Speed = -9999.9, Temp. = -1.00e+05 -// # Modified Seconds ------------- Solar Wind ----------- -// # UT Date Time Julian of the Proton Bulk Ion -// # YR MO DA HHMM Day Day S Density Speed Temperature -// #------------------------------------------------------------------------- -// 2024 05 06 1657 60436 61020 1 4.9 475.0 2.38e+05 -internal static class SolarWindPlasmaDataParser -{ - private const string MissingDataValue = "-9999.9"; - private const string MissingTemperatureValue = "-1.00e+05"; - - public static IReadOnlyList Parse(string text) - { - var records = new List(); - var lines = text.SplitLines(); - Span fieldsRange = stackalloc Range[32]; - - foreach (var line in lines) - { - var trimmedLine = line.Line.Trim(); - if (trimmedLine.Length == 0 || trimmedLine[0] == '#') - { - continue; - } - var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - - // check if line contains data - if (rangesCount != 10 || !trimmedLine[fieldsRange[0]].IsParsableAsInt()) - { - continue; - } - - var record = new SolarWindPlasmaRecord - ( - DateTime: new DateTime( - year: trimmedLine[fieldsRange[0]].ParseIntInvariant(), - month: trimmedLine[fieldsRange[1]].ParseIntInvariant(), - day: trimmedLine[fieldsRange[2]].ParseIntInvariant(), - hour: trimmedLine[fieldsRange[3]][..2].ParseIntInvariant(), - minute: trimmedLine[fieldsRange[3]][2..].ParseIntInvariant(), - second: 0, - DateTimeKind.Utc), - Status: trimmedLine[fieldsRange[6]].ParseIntInvariant(), - ProtonDensity: GetFloatOrNull(trimmedLine[fieldsRange[7]]), - BulkSpeed: GetFloatOrNull(trimmedLine[fieldsRange[8]]), - IonTemperature: GetTemperatureOrNull(trimmedLine[fieldsRange[9]]) - ); - records.Add(record); - } - - return records; - } - - private static float? GetFloatOrNull(ReadOnlySpan value) - => value.SequenceEqual(MissingDataValue) - ? null - : value.ParseFloatInvariant(); - - private static float? GetTemperatureOrNull(ReadOnlySpan value) - => value.SequenceEqual(MissingTemperatureValue) - ? null - : value.ParseFloatInvariant(); -} diff --git a/src/ExternalResources/Ace/IAceClient.cs b/src/ExternalResources/Ace/IAceClient.cs deleted file mode 100644 index c187464..0000000 --- a/src/ExternalResources/Ace/IAceClient.cs +++ /dev/null @@ -1,19 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace; - -/// -/// ACE Spacecraft client -/// -public interface IAceClient -{ - /// - /// Get ACE Magnetometer data - /// - Task> GetMagnetometerDataAsync(CancellationToken cancellationToken); - - /// - /// Get ACE Solar Wind Electron Proton Alpha Monitor data - /// - Task> GetSwepamDataAsync(CancellationToken cancellationToken); -} diff --git a/src/ExternalResources/Ace/Responses/MagnetometerRecord.cs b/src/ExternalResources/Ace/Responses/MagnetometerRecord.cs deleted file mode 100644 index d376c3b..0000000 --- a/src/ExternalResources/Ace/Responses/MagnetometerRecord.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; - -/// -/// 1-minute averaged Real-time Interplanetary Magnetic Field Values -/// -/// Date and time of record (UTC) -/// Data Status. 0 = nominal data 1 to 8 = bad data record 9 = no data -/// IMF GSM x-component -/// IMF GSM y-component -/// IMF GSM z-component -/// IMF module -/// Spacecraft latitude -/// Spacecraft longitude -public record MagnetometerRecord( - DateTime DateTime, - int Status, - float? Bx, - float? By, - float? Bz, - float? Bt, - float? Latitude, - float? Longitude); diff --git a/src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs b/src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs deleted file mode 100644 index 9b68df1..0000000 --- a/src/ExternalResources/Ace/Responses/SolarWindPlasmaRecord.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace.Responses; - -/// -/// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma -/// -/// Date and time of record (UTC) -/// Data Status. 0 = nominal data 1 to 8 = bad data record 9 = no data -/// Solar Wind proton density -/// Solar Wind plasma speed -/// Solar Wind Ion Temp -public record SolarWindPlasmaRecord( - DateTime DateTime, - int Status, - float? ProtonDensity, - float? BulkSpeed, - float? IonTemperature -); diff --git a/src/ExternalResources/Dscovr/DscovrClient.cs b/src/ExternalResources/Dscovr/DscovrClient.cs deleted file mode 100644 index 2742057..0000000 --- a/src/ExternalResources/Dscovr/DscovrClient.cs +++ /dev/null @@ -1,72 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Extensions; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; -using Microsoft.Extensions.Options; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr; - -internal sealed class DscovrClient : IDscovrClient -{ - private readonly HttpClient _httpClient; - private readonly Uri _baseUrl; - - public DscovrClient( - HttpClient httpClient, - IOptions options) - { - _httpClient = httpClient; - _baseUrl = options.Value.RequiredServerUrl; - } - - public async Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-2-hour.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-1-day.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-3-day.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-7-day.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-2-hour.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-1-day.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-3-day.json", cancellationToken) - .ConfigureAwait(false); - - public async Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-7-day.json", cancellationToken) - .ConfigureAwait(false); - - private async Task> GetMagnetometerDataAsync(string relativeUri, CancellationToken cancellationToken) - { - var url = new Uri(_baseUrl, relativeUri); - var response = await _httpClient.GetAsync(url, cancellationToken); - response.EnsureSuccessStatusCode(); - var text = await response.Content.ReadAsStringAsync(cancellationToken); - - return MagnetometerDataParser.Parse(text); - } - - private async Task> GetSolarWindPlasmaDataAsync(string relativeUri, CancellationToken cancellationToken) - { - var url = new Uri(_baseUrl, relativeUri); - var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); - - return SolarWindPlasmaDataParser.Parse(text); - } -} diff --git a/src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs b/src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs deleted file mode 100644 index 01fded7..0000000 --- a/src/ExternalResources/Dscovr/Extensions/MagnetometerDataParser.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Text.Json; -using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Extensions; - -// DSCOVR Magnetometer data example: -// [ -// [ -// "time_tag", -// "bx_gsm", -// "by_gsm", -// "bz_gsm", -// "lon_gsm", -// "lat_gsm", -// "bt" -// ], -// [ -// "2024-05-19 16:50:00.000", -// "-2.25", -// "8.71", -// "-1.79", -// "104.50", -// "-11.25", -// "9.17" -// ] -// ] - -// TODO Write more memory allocations optimized parser -internal static class MagnetometerDataParser -{ - private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; - - public static IReadOnlyList Parse(string text) - { - using var jsonDoc = JsonDocument.Parse(text); - var rootElement = jsonDoc.RootElement; - - var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) - { - return Array.Empty(); - } - - var fieldNames = rootElement[0]; - var magnetometerRecords = new List(arrayLength); - - var timeTagIndex = GetIndex(fieldNames, "time_tag"); - var bxGsmIndex = GetIndex(fieldNames, "bx_gsm"); - var byGsmIndex = GetIndex(fieldNames, "by_gsm"); - var bzGsmIndex = GetIndex(fieldNames, "bz_gsm"); - var btIndex = GetIndex(fieldNames, "bt"); - var latGsmIndex = GetIndex(fieldNames, "lat_gsm"); - var lonGsmIndex = GetIndex(fieldNames, "lon_gsm"); - - foreach (var record in rootElement.EnumerateArray().Skip(1)) - { - magnetometerRecords.Add(new MagnetometerRecord( - DateTime: DateTime.ParseExact( - record[timeTagIndex].GetString().Required(), DateTimeFormat, - provider: null, - style: System.Globalization.DateTimeStyles.AssumeUniversal | - System.Globalization.DateTimeStyles.AdjustToUniversal), - Bx: record[bxGsmIndex].GetString()?.ParseFloatInvariant(), - By: record[byGsmIndex].GetString()?.ParseFloatInvariant(), - Bz: record[bzGsmIndex].GetString()?.ParseFloatInvariant(), - Bt: record[btIndex].GetString()?.ParseFloatInvariant(), - Latitude: record[latGsmIndex].GetString()?.ParseFloatInvariant(), - Longitude: record[lonGsmIndex].GetString()?.ParseFloatInvariant() - )); - } - - return magnetometerRecords; - } - - private static int GetIndex(JsonElement fieldNames, string fieldName) - { - var index = 0; - foreach (var name in fieldNames.EnumerateArray()) - { - if (string.Equals(name.GetString(), fieldName, StringComparison.OrdinalIgnoreCase)) - { - return index; - } - index++; - } - - throw new InvalidOperationException($"Field '{fieldName}' not found."); - } -} diff --git a/src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs b/src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs deleted file mode 100644 index 15511f4..0000000 --- a/src/ExternalResources/Dscovr/Extensions/SolarWindPlasmaDataParser.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Text.Json; -using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Extensions; - -// DSCOVR Solar wind plasma data example: -// [ -// [ -// "time_tag", -// "density", -// "speed", -// "temperature" -// ], -// [ -// "2024-05-20 05:51:00.000", -// "2.18", -// "393.9", -// "36967" -// ], -// [ -// "2024-05-20 05:52:00.000", -// "2.60", -// "397.4", -// "44618" -// ] -// ] - -// TODO Write more memory allocations optimized parser -internal static class SolarWindPlasmaDataParser -{ - private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; - - public static IReadOnlyList Parse(string text) - { - using var jsonDoc = JsonDocument.Parse(text); - var rootElement = jsonDoc.RootElement; - - var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) - { - return Array.Empty(); - } - - var fieldNames = rootElement[0]; - var solarWindPlasmaRecords = new List(arrayLength); - - var timeTagIndex = GetIndex(fieldNames, "time_tag"); - var densityIndex = GetIndex(fieldNames, "density"); - var speedIndex = GetIndex(fieldNames, "speed"); - var temperatureIndex = GetIndex(fieldNames, "temperature"); - - foreach (var record in rootElement.EnumerateArray().Skip(1)) - { - solarWindPlasmaRecords.Add(new SolarWindPlasmaRecord( - DateTime: DateTime.ParseExact( - record[timeTagIndex].GetString().Required(), DateTimeFormat, - provider: null, - style: System.Globalization.DateTimeStyles.AssumeUniversal | - System.Globalization.DateTimeStyles.AdjustToUniversal), - ProtonDensity: record[densityIndex].GetString()?.ParseFloatInvariant(), - BulkSpeed: record[speedIndex].GetString()?.ParseFloatInvariant(), - IonTemperature: record[temperatureIndex].GetString()?.ParseFloatInvariant() - )); - } - - return solarWindPlasmaRecords; - } - - private static int GetIndex(JsonElement fieldNames, string fieldName) - { - var index = 0; - foreach (var name in fieldNames.EnumerateArray()) - { - if (string.Equals(name.GetString(), fieldName, StringComparison.OrdinalIgnoreCase)) - { - return index; - } - index++; - } - - throw new InvalidOperationException($"Field '{fieldName}' not found."); - } -} diff --git a/src/ExternalResources/Dscovr/IDscovrClient.cs b/src/ExternalResources/Dscovr/IDscovrClient.cs deleted file mode 100644 index 0abcaef..0000000 --- a/src/ExternalResources/Dscovr/IDscovrClient.cs +++ /dev/null @@ -1,49 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr; - -/// -/// DSCOVR Spacecraft client -/// -public interface IDscovrClient -{ - /// - /// Get DSCOVR Magnetometer data (2 hours) - /// - Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Magnetometer data (1 day) - /// - Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Magnetometer data (3 days) - /// - Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Magnetometer data (7 days) - /// - Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (2 hours) - /// - Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (1 day) - /// - Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (3 days) - /// - Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken); - - /// - /// Get DSCOVR Solar Wind Electron Proton Alpha Monitor data (7 days) - /// - Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken); -} diff --git a/src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs b/src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs deleted file mode 100644 index 46d35d3..0000000 --- a/src/ExternalResources/Dscovr/Responses/MagnetometerRecord.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; - -/// -/// 1-minute averaged Real-time Interplanetary Magnetic Field Values (DSCOVR) -/// -/// Date and time of record (UTC) -/// IMF GSM x-component -/// IMF GSM y-component -/// IMF GSM z-component -/// IMF module -/// Spacecraft latitude -/// Spacecraft longitude -public record MagnetometerRecord( - DateTime DateTime, - float? Bx, - float? By, - float? Bz, - float? Bt, - float? Latitude, - float? Longitude); diff --git a/src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs b/src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs deleted file mode 100644 index 9b4c277..0000000 --- a/src/ExternalResources/Dscovr/Responses/SolarWindPlasmaRecord.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr.Responses; - -/// -/// 1-minute averaged Real-time Bulk Parameters of the Solar Wind Plasma (DSCOVR) -/// -/// Date and time of record (UTC) -/// Solar Wind proton density -/// Solar Wind plasma speed -/// Solar Wind Ion Temp -public record SolarWindPlasmaRecord( - DateTime DateTime, - float? ProtonDensity, - float? BulkSpeed, - float? IonTemperature -); diff --git a/src/ExternalResources/ExternalResources.csproj b/src/ExternalResources/ExternalResources.csproj deleted file mode 100644 index c4422ef..0000000 --- a/src/ExternalResources/ExternalResources.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources - - - - - - - - - - diff --git a/src/ExternalResources/Infrastructure/ApiResource.cs b/src/ExternalResources/Infrastructure/ApiResource.cs deleted file mode 100644 index 63e5a95..0000000 --- a/src/ExternalResources/Infrastructure/ApiResource.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure; - -/// -/// Relative paths to target data -/// -public static class ApiResource -{ - /// - /// Folder with php scripts for Pc index data - /// - public static class PcIndex - { - /// - /// Base path to php scripts - /// - public const string BasePath = "ovation_test/"; - - /// - /// Relative path to PcN data - /// - public const string PcN = "make_json_pc.php?ns=pcn"; - - /// - /// Relative path to PcS data - /// - public const string PcS = "make_json_pc.php?ns=pcs"; - } -} diff --git a/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs b/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs deleted file mode 100644 index 38ab2b8..0000000 --- a/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientBase.cs +++ /dev/null @@ -1,36 +0,0 @@ -using AuroraScienceHub.Framework.Http; -using Microsoft.Extensions.Options; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; - -internal abstract class AariGeophysClientBase -{ - private readonly Uri _baseUri; - private readonly HttpClient _httpClient; - - /// - /// Relative path to data generating scripts - /// - protected abstract string BasePath { get; } - - /// .ctor - protected AariGeophysClientBase(HttpClient httpClient, IOptions options) - { - _baseUri = options.Value.RequiredServerUrl; - _httpClient = httpClient; - } - - /// - /// Build full URL to the file - /// - /// File name - protected Uri GetPathToData(string dataUrl) => UrlBuilder.From(_baseUri, BasePath + dataUrl).Build(); - - /// - /// Send request - /// - /// Request - /// Cancellation token - protected async Task SendRequestAsync(HttpRequestMessage request, - CancellationToken cancellationToken) => await _httpClient.SendAsync(request, cancellationToken); -} diff --git a/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs b/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs deleted file mode 100644 index 7b6843d..0000000 --- a/src/ExternalResources/Infrastructure/Configuration/AariGeophysClientOptions.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; - -/// -/// HTTP client options for geophysics data import. -/// -public sealed class AariGeophysClientOptions -{ - public const string OptionKey = "AariGeophys"; - - public Uri? ServerUrl { get; init; } - - public Uri RequiredServerUrl => EnsureNotNull(ServerUrl, nameof(ServerUrl)); - - private static T EnsureNotNull(T? value, string name) - where T : class - => value ?? throw new ArgumentNullException(name, $"Configuration value '{OptionKey}:{name}' is not set."); -} diff --git a/src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs b/src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs deleted file mode 100644 index 4de1591..0000000 --- a/src/ExternalResources/Infrastructure/Configuration/NoaaClientOptions.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; - -public sealed class NoaaClientOptions -{ - public const string OptionKey = "Noaa"; - - private const string EmptyServerUrlMessage = $"Configuration value '{OptionKey}:{nameof(ServerUrl)}' is not set."; - - public Uri? ServerUrl { get; set; } - - public Uri RequiredServerUrl => ServerUrl ?? throw new ArgumentNullException(nameof(ServerUrl), EmptyServerUrlMessage); -} diff --git a/src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs b/src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs deleted file mode 100644 index 1032258..0000000 --- a/src/ExternalResources/KpIndex/Extensions/KpIndex27DayDataParser.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using AuroraScienceHub.Framework.Utilities.System; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; - -// 27-day KP-index forecast data example: -// :Product: 27-day Space Weather Outlook Table 27DO.txt -// :Issued: 2025 Jan 06 0242 UTC -// # Prepared by the US Dept. of Commerce, NOAA, Space Weather Prediction Center -// # Product description and SWPC contact on the Web -// # https://www.swpc.noaa.gov/content/subscription-services -// # -// # 27-day Space Weather Outlook Table -// # Issued 2025-01-06 -// # -// # UTC Radio Flux Planetary Largest -// # Date 10.7 cm A Index Kp Index -// 2025 Jan 06 172 22 5 -// 2025 Jan 07 165 12 4 -// 2025 Jan 08 165 8 3 - -internal static class KpIndex27DayDataParser -{ - private const int ForecastDaysCount = 27; - - public static IReadOnlyList Parse(string text) - { - var responses = new List(ForecastDaysCount); - - var lineEntries = text.SplitLines(); - foreach (var lineEntry in lineEntries) - { - if (TryParseLine(lineEntry.Line, out var response)) - { - responses.Add(response); - } - } - - return responses; - } - - private static bool TryParseLine(ReadOnlySpan line, [NotNullWhen(true)] out KpIndex27DayResponse? response) - { - var trimmedLine = line.Trim(); - if (trimmedLine.IsEmpty || trimmedLine[0] == '#' || trimmedLine[0] == ':') - { - response = null; - return false; - } - - const int fieldsInRowCount = 6; - Span fieldsRange = stackalloc Range[fieldsInRowCount]; - var rangesCount = trimmedLine.Split(fieldsRange, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - - if (rangesCount != fieldsInRowCount) - { - response = null; - return false; - } - - var yearString = trimmedLine[fieldsRange[0]]; - var monthString = trimmedLine[fieldsRange[1]]; - var dayString = trimmedLine[fieldsRange[2]]; - - var dateString = string.Concat(yearString, monthString, dayString); - if (!DateOnly.TryParse(dateString, out var date)) - { - response = null; - return false; - } - - var kpIndexString = trimmedLine[fieldsRange[5]]; - if (!int.TryParse(kpIndexString, out var kpIndex)) - { - response = null; - return false; - } - - response = new KpIndex27DayResponse(date, kpIndex); - return true; - } -} diff --git a/src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs b/src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs deleted file mode 100644 index 88d86b7..0000000 --- a/src/ExternalResources/KpIndex/Extensions/KpIndex3DayDataParser.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Text.Json; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; - -// 3-day KP-index forecast data example: -// [ -// [ -// "time_tag", -// "kp", -// "observed", -// "noaa_scale" -// ], -// [ -// "2025-01-04 00:00:00", -// "2.67", -// "observed", -// null -// ] -// ] - -internal static class KpIndex3DayDataParser -{ - public static IReadOnlyList Parse(string text) - { - using var jsonDocument = JsonDocument.Parse(text); - var rootElement = jsonDocument.RootElement; - - var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) - { - return Array.Empty(); - } - - var responses = new List(arrayLength); - foreach (var jsonElement in rootElement.EnumerateArray().Skip(1)) - { - if (TryParseElement(jsonElement, out var response)) - { - responses.Add(response); - } - } - - return responses; - } - - private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out KpIndex3DayResponse? response) - { - if (jsonElement.ValueKind != JsonValueKind.Array || - jsonElement.GetArrayLength() < 2) - { - response = null; - return false; - } - - var dateTimeString = jsonElement[0].GetString(); - if (!DateTime.TryParse(dateTimeString, out var dateTime)) - { - response = null; - return false; - } - - var kpIndexString = jsonElement[1].GetString(); - if (!float.TryParse(kpIndexString, NumberFormatInfo.InvariantInfo, out var kpIndex)) - { - response = null; - return false; - } - - response = new KpIndex3DayResponse(dateTime, kpIndex); - return true; - } -} diff --git a/src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs b/src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs deleted file mode 100644 index 82e810e..0000000 --- a/src/ExternalResources/KpIndex/Extensions/KpIndexNowcastDataParser.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Text.Json; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; - -// Current KP-index forecast data example: -// [ -// [ -// "time_tag", -// "Kp", -// "a_running", -// "station_count" -// ], -// [ -// "2025-01-05 00:00:00.000", -// "3.67", -// "22", -// "8" -// ] -// ] - -internal static class KpIndexNowcastDataParser -{ - public static IReadOnlyList Parse(string text) - { - using var jsonDocument = JsonDocument.Parse(text); - var rootElement = jsonDocument.RootElement; - - var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) - { - return Array.Empty(); - } - - var responses = new List(arrayLength); - foreach (var jsonElement in rootElement.EnumerateArray().Skip(1)) - { - if (TryParseElement(jsonElement, out var response)) - { - responses.Add(response); - } - } - - return responses; - } - - private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out KpIndexNowcastResponse? response) - { - if (jsonElement.ValueKind != JsonValueKind.Array || - jsonElement.GetArrayLength() < 4) - { - response = null; - return false; - } - - var dateTimeString = jsonElement[0].GetString(); - if (!DateTime.TryParse(dateTimeString, out var dateTime)) - { - response = null; - return false; - } - - var kpIndexString = jsonElement[1].GetString(); - if (!float.TryParse(kpIndexString, NumberFormatInfo.InvariantInfo, out var kpIndex)) - { - response = null; - return false; - } - - var stationsCountString = jsonElement[3].GetString(); - if (!int.TryParse(stationsCountString, NumberFormatInfo.InvariantInfo, out var stationsCount)) - { - response = null; - return false; - } - - response = new KpIndexNowcastResponse(dateTime, kpIndex, stationsCount); - return true; - } -} diff --git a/src/ExternalResources/KpIndex/IKpIndexClient.cs b/src/ExternalResources/KpIndex/IKpIndexClient.cs deleted file mode 100644 index 1387510..0000000 --- a/src/ExternalResources/KpIndex/IKpIndexClient.cs +++ /dev/null @@ -1,24 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex; - -/// -/// KP-index client -/// -public interface IKpIndexClient -{ - /// - /// Get 27-day KP-index forecast - /// - Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken); - - /// - /// Get 3-day KP-index forecast - /// - Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken); - - /// - /// Get KP-index nowcast - /// - Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken); -} diff --git a/src/ExternalResources/KpIndex/KpIndexClient.cs b/src/ExternalResources/KpIndex/KpIndexClient.cs deleted file mode 100644 index c065790..0000000 --- a/src/ExternalResources/KpIndex/KpIndexClient.cs +++ /dev/null @@ -1,50 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Extensions; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex; - -internal sealed class KpIndexClient : IKpIndexClient -{ - private readonly ILogger _logger; - private readonly HttpClient _client; - private readonly Uri _baseUrl; - - public KpIndexClient( - ILogger logger, - HttpClient client, - IOptions options) - { - _logger = logger; - _client = client; - _baseUrl = options.Value.RequiredServerUrl; - } - - public async Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken) - { - var text = await GetStringOrDefaultAsync("text/27-day-outlook.txt", cancellationToken).ConfigureAwait(false); - return string.IsNullOrWhiteSpace(text) ? [] : KpIndex27DayDataParser.Parse(text); - } - - public async Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken) - { - var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index-forecast.json", cancellationToken).ConfigureAwait(false); - return string.IsNullOrWhiteSpace(text) ? [] : KpIndex3DayDataParser.Parse(text); - } - - public async Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken) - { - var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index.json", cancellationToken).ConfigureAwait(false); - return string.IsNullOrWhiteSpace(text) ? [] : KpIndexNowcastDataParser.Parse(text); - } - - private async Task GetStringOrDefaultAsync(string relativeUrl, CancellationToken cancellationToken) - { - var url = new Uri(_baseUrl, relativeUrl); - var response = await _client.GetAsync(url, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - return await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); - } -} diff --git a/src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs b/src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs deleted file mode 100644 index d07a122..0000000 --- a/src/ExternalResources/KpIndex/Responses/KpIndex27DayResponse.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -/// -/// 27-day KP-index data -/// -/// Date of record -/// KP-index -public sealed record KpIndex27DayResponse( - DateOnly Date, - int KpIndex); diff --git a/src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs b/src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs deleted file mode 100644 index 7bfaa49..0000000 --- a/src/ExternalResources/KpIndex/Responses/KpIndex3DayResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -/// -/// 3-day KP-index data -/// -/// Date and time of record (UTC) -/// KP-index -public sealed record KpIndex3DayResponse(DateTime DateTime, float KpIndex); diff --git a/src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs b/src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs deleted file mode 100644 index 4c50e2b..0000000 --- a/src/ExternalResources/KpIndex/Responses/KpIndexNowcastResponse.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex.Responses; - -/// -/// Current KP-index data -/// -/// Date and time of record (UTC) -/// KP-index -/// KP-index calculated by stations count -public sealed record KpIndexNowcastResponse( - DateTime DateTime, - float KpIndex, - int StationsCount); diff --git a/src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs b/src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs deleted file mode 100644 index eed4d95..0000000 --- a/src/ExternalResources/PcIndex/Extensions/PcIndexDataParser.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Text.Json; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Extensions; - -/// -/// Pc-index raw data parser -/// -internal static class PcIndexDataParser -{ - /// - /// Parse raw Pc-index data - /// - /// Content of Pc-index raw response - /// - /// Example: - /// [[1766441400000,3.2202699184417725],[1766441460000,3.098059892654419],[1766441520000,2.9881300926208496],...]] - /// where first value is Unix time in milliseconds, second value is Pc-index. - /// - public static IReadOnlyList Parse(string content) - { - using var jsonDocument = JsonDocument.Parse(content); - var rootElement = jsonDocument.RootElement; - var arrayLength = rootElement.GetArrayLength(); - - if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 1) - { - return []; - } - - var responses = new List(arrayLength); - - foreach (var jsonElement in rootElement.EnumerateArray()) - { - if (TryParseElement(jsonElement, out var response)) - { - responses.Add(response); - } - } - - return responses; - } - - private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] out PcIndexResponse? response) - { - if (jsonElement.ValueKind != JsonValueKind.Array - || jsonElement.GetArrayLength() < 2 - || jsonElement[0].GetInt64() is 0) - { - response = null; - return false; - } - - var dateTime = DateTimeOffset.FromUnixTimeMilliseconds(jsonElement[0].GetInt64()).DateTime; - - var pcIndexRaw = jsonElement[1].GetRawText(); - float? pcIndex = float.TryParse(pcIndexRaw, NumberFormatInfo.InvariantInfo, out var pcIndexFloat) - ? pcIndexFloat - : null; - - response = new PcIndexResponse(dateTime, pcIndex); - return true; - } -} diff --git a/src/ExternalResources/PcIndex/IPcIndexClient.cs b/src/ExternalResources/PcIndex/IPcIndexClient.cs deleted file mode 100644 index e25190c..0000000 --- a/src/ExternalResources/PcIndex/IPcIndexClient.cs +++ /dev/null @@ -1,19 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex; - -/// -/// Pc-index client -/// -public interface IPcIndexClient -{ - /// - /// Get Northern Pc-index from AARI web-server - /// - Task> GetPcNIndexAsync(CancellationToken cancellationToken); - - /// - /// Get Southern Pc-index from AARI web-server - /// - Task> GetPcSIndexAsync(CancellationToken cancellationToken); -} diff --git a/src/ExternalResources/PcIndex/PcIndexClient.cs b/src/ExternalResources/PcIndex/PcIndexClient.cs deleted file mode 100644 index 907cd4a..0000000 --- a/src/ExternalResources/PcIndex/PcIndexClient.cs +++ /dev/null @@ -1,34 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Extensions; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; -using Microsoft.Extensions.Options; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex; - -internal sealed class PcIndexClient : AariGeophysClientBase, IPcIndexClient -{ - protected override string BasePath => ApiResource.PcIndex.BasePath; - - public PcIndexClient(HttpClient client, IOptions options) - : base(client, options) { } - - public async Task> GetPcNIndexAsync(CancellationToken cancellationToken) - => await GetPcIndexAsync(ApiResource.PcIndex.PcN, cancellationToken).ConfigureAwait(false); - - public async Task> GetPcSIndexAsync(CancellationToken cancellationToken) - => await GetPcIndexAsync(ApiResource.PcIndex.PcS, cancellationToken).ConfigureAwait(false); - - - private async Task> GetPcIndexAsync(string pcUrl, CancellationToken cancellationToken) - { - var requestUrl = GetPathToData(pcUrl); - var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); - using var response = await SendRequestAsync(request, cancellationToken); - response.EnsureSuccessStatusCode(); - - var content = await response.Content.ReadAsStringAsync(cancellationToken); - - return string.IsNullOrWhiteSpace(content) ? [] : PcIndexDataParser.Parse(content); - } -} diff --git a/src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs b/src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs deleted file mode 100644 index 7396559..0000000 --- a/src/ExternalResources/PcIndex/Responses/PcIndexResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex.Responses; - -/// -/// PC-index data -/// -/// Date and time of record (UTC) -/// Northern or Southern PC-index -public sealed record PcIndexResponse(DateTime DateTime, float? Pc); diff --git a/src/ExternalResources/ServiceCollectionExtensions.cs b/src/ExternalResources/ServiceCollectionExtensions.cs deleted file mode 100644 index 88b8ad0..0000000 --- a/src/ExternalResources/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Ace; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Dscovr; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.Infrastructure.Configuration; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.KpIndex; -using AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources.PcIndex; -using Microsoft.Extensions.DependencyInjection; - -namespace AuroraScienceHub.SWeather.PreliminaryDataImport.ExternalResources; - -public static class ServiceCollectionExtensions -{ - public static IServiceCollection AddAceClient(this IServiceCollection services) - { - services.AddOptions() - .BindConfiguration(NoaaClientOptions.OptionKey); - services.AddOptions() - .BindConfiguration(AariGeophysClientOptions.OptionKey); - - services.AddHttpClient(); - services.AddHttpClient(); - services.AddHttpClient(); - services.AddHttpClient(); - - return services; - } -} From b57f9a22ca98353777be4d784da0216eab57d264 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:16:05 +0300 Subject: [PATCH 03/19] Remove AuroraScienceHub package source from NuGet configuration --- NuGet.Config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f4833d2..172a720 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -4,17 +4,10 @@ - - - - - - - From e667275cebdf7742fc32118ca1dfd32d1bfffe67 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:20:47 +0300 Subject: [PATCH 04/19] Add NOAA integration package and update NuGet configuration --- NuGet.Config | 7 +++++ src/Noaa/README.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/Noaa/README.md diff --git a/NuGet.Config b/NuGet.Config index 172a720..f4833d2 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -4,10 +4,17 @@ + + + + + + + diff --git a/src/Noaa/README.md b/src/Noaa/README.md new file mode 100644 index 0000000..0a7a2ed --- /dev/null +++ b/src/Noaa/README.md @@ -0,0 +1,72 @@ +# AuroraScienceHub.Integrations.Noaa + +NOAA space weather data integration with support for ACE, DSCOVR spacecraft and KP-index data. + +## Overview + +Provides unified interfaces for accessing NOAA space weather data including solar wind measurements, magnetometer data, and geomagnetic activity indices. + +## Key Features + +- **ACE Spacecraft** - Access to Magnetometer and SWEPAM (Solar Wind) data +- **DSCOVR Spacecraft** - Magnetometer and Solar Wind Plasma data with multiple time ranges +- **KP-Index** - Geomagnetic activity forecasts and nowcast data +- **Unified Interfaces** - Consistent API across all NOAA data sources + +## Installation + +```bash +dotnet add package AuroraScienceHub.Integrations.Noaa +``` + +## Usage + +### Service Registration + +```csharp +// Configuration +builder.Services.AddNoaaClients(); +``` + +### ACE Client + +```csharp +var magnetometerData = await aceClient.GetMagnetometerDataAsync(cancellationToken); +var solarWindData = await aceClient.GetSwepamDataAsync(cancellationToken); +``` + +### DSCOVR Client + +```csharp +// Available time ranges: 2H, 1D, 3D, 7D +var magnetometerData = await dscovrClient.GetMagnetometerData1DAsync(cancellationToken); +var solarWindData = await dscovrClient.GetSolarWindPlasmaData1DAsync(cancellationToken); +``` + +### KP-Index Client + +```csharp +var nowcast = await kpIndexClient.GetKpIndexNowcastAsync(cancellationToken); +var forecast3Day = await kpIndexClient.GetKpIndex3DayForecastAsync(cancellationToken); +var forecast27Day = await kpIndexClient.GetKpIndex27DayForecastAsync(cancellationToken); +``` + +### Configuration + +```json +{ + "Noaa": { + "ServerUrl": "https://services.swpc.noaa.gov" + } +} +``` + + +## License + +See [LICENSE](../../LICENSE) file in the repository root. + +## Related Packages + +- `AuroraScienceHub.Framework.Http` - HTTP utilities +- `AuroraScienceHub.Framework.Utilities` - Common utilities From 032601bc5e005fdceeb495cf00707c611907a753 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:28:12 +0300 Subject: [PATCH 05/19] Remove AuroraScienceHub package source from NuGet configuration --- NuGet.Config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f4833d2..172a720 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -4,17 +4,10 @@ - - - - - - - From af02748c7bda0d7af8adf8c11e0d812724bc1ef1 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:33:38 +0300 Subject: [PATCH 06/19] Add AuroraScienceHub package source to NuGet configuration --- NuGet.Config | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 172a720..25fdb36 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -4,10 +4,17 @@ + - + + + + + + + From 4c26af1ddb7918ccaff28661dc8bc047cdbcfa4e Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:37:26 +0300 Subject: [PATCH 07/19] Add NuGet.config preparation step for AuroraScienceHub package source --- .github/workflows/dotnet.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 2dd9ff7..db551d6 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -55,6 +55,34 @@ jobs: echo "MinVer: ${MINVER_VERSION}" echo "Package: ${PKG_VERSION}" + - name: Prepare NuGet.config + run: | + cat > NuGet.config < + + + + + + + + + + + + + + + + + + + + + + + EOF + - name: Restore run: dotnet restore From 1eb97ea25edbd8150ee71917d7a9390a0b5c3758 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:48:59 +0300 Subject: [PATCH 08/19] Update README to reflect .NET 10.0 target and remove outdated prerequisites --- README.md | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 1aa1abc..2c66be2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ ## Getting Started -All packages are distributed via NuGet and target **.NET 9.0**. Install individual packages as needed: +All packages are distributed via NuGet and target **.NET 10.0**. Install individual packages as needed: ```bash dotnet add package AuroraScienceHub.Integrations.Noaa @@ -54,30 +54,13 @@ This repository provides HTTP clients for external space weather data sources: - **Type-Safe Clients** - Strongly-typed HTTP clients with dependency injection support - **Response Models** - Well-defined DTOs for all API responses - **Configuration** - Options pattern for configuring API endpoints -- **Modern .NET** - Built on .NET 9 with latest C# features +- **Modern .NET** - Built on .NET 10 with latest C# features ## Development ### Prerequisites -- .NET 9.0 SDK or later -- IDE with C# support (Rider, Visual Studio, VS Code) - -### Building the Solution - -```bash -# Restore dependencies -dotnet restore - -# Build all projects -dotnet build - -# Run tests -dotnet test - -# Create NuGet packages -dotnet pack -``` +- .NET 10.0 SDK or later ## Code Style @@ -106,7 +89,6 @@ dotnet format --verify-no-changes Unit tests are located in the `tests/UnitTests/` directory. The framework uses: - xUnit for test execution -- AutoFixture with AutoMoq for test data generation - Moq for mocking ## License @@ -125,4 +107,4 @@ When contributing to this repository: --- -**Note**: This project provides data source integrations for the SWeather (Space Weather) monitoring application. +**Note**: This project provides data source integrations for space weather monitoring application. From fda865efd49505d501150a2e516505f408b93de7 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Sun, 1 Feb 2026 17:58:58 +0300 Subject: [PATCH 09/19] Enhance data parsers to handle non-array JSON responses and improve date parsing --- src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs | 7 ++++++- src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs | 7 ++++++- src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs | 3 ++- src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs | 9 +++++++-- src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs | 9 +++++++-- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs b/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs index d8d40eb..0ee7c86 100644 --- a/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs +++ b/src/Noaa/Dscovr/Extensions/MagnetometerDataParser.cs @@ -34,8 +34,13 @@ public static IReadOnlyList Parse(string text) using var jsonDoc = JsonDocument.Parse(text); var rootElement = jsonDoc.RootElement; + if (rootElement.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) + if (rootElement.GetArrayLength() < 2) { return Array.Empty(); } diff --git a/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs b/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs index 27d6299..422bf99 100644 --- a/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs +++ b/src/Noaa/Dscovr/Extensions/SolarWindPlasmaDataParser.cs @@ -34,8 +34,13 @@ public static IReadOnlyList Parse(string text) using var jsonDoc = JsonDocument.Parse(text); var rootElement = jsonDoc.RootElement; + if (rootElement.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || rootElement.GetArrayLength() < 2) + if (rootElement.GetArrayLength() < 2) { return Array.Empty(); } diff --git a/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs b/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs index eb87a06..414f6d6 100644 --- a/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs +++ b/src/Noaa/KpIndex/Extensions/KpIndex27DayDataParser.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using System.Globalization; using AuroraScienceHub.Framework.Utilities.System; using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; @@ -64,7 +65,7 @@ private static bool TryParseLine(ReadOnlySpan line, [NotNullWhen(true)] ou var dayString = trimmedLine[fieldsRange[2]]; var dateString = string.Concat(yearString, monthString, dayString); - if (!DateOnly.TryParse(dateString, out var date)) + if (!DateOnly.TryParseExact(dateString, "yyyyMMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) { response = null; return false; diff --git a/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs b/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs index 6019188..8867d3f 100644 --- a/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs +++ b/src/Noaa/KpIndex/Extensions/KpIndex3DayDataParser.cs @@ -28,8 +28,13 @@ public static IReadOnlyList Parse(string text) using var jsonDocument = JsonDocument.Parse(text); var rootElement = jsonDocument.RootElement; + if (rootElement.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) + if (arrayLength < 2) { return Array.Empty(); } @@ -56,7 +61,7 @@ private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] } var dateTimeString = jsonElement[0].GetString(); - if (!DateTime.TryParse(dateTimeString, out var dateTime)) + if (!DateTime.TryParse(dateTimeString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dateTime)) { response = null; return false; diff --git a/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs b/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs index 4198752..1fbbaeb 100644 --- a/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs +++ b/src/Noaa/KpIndex/Extensions/KpIndexNowcastDataParser.cs @@ -28,8 +28,13 @@ public static IReadOnlyList Parse(string text) using var jsonDocument = JsonDocument.Parse(text); var rootElement = jsonDocument.RootElement; + if (rootElement.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + var arrayLength = rootElement.GetArrayLength(); - if (rootElement.ValueKind != JsonValueKind.Array || arrayLength < 2) + if (arrayLength < 2) { return Array.Empty(); } @@ -56,7 +61,7 @@ private static bool TryParseElement(JsonElement jsonElement, [NotNullWhen(true)] } var dateTimeString = jsonElement[0].GetString(); - if (!DateTime.TryParse(dateTimeString, out var dateTime)) + if (!DateTime.TryParse(dateTimeString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dateTime)) { response = null; return false; From f49abf215b5ca6e249a45b5ff4ab50b578a595a1 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Mon, 2 Feb 2026 19:43:00 +0300 Subject: [PATCH 10/19] Add NOAA client sample application with CLI interface and data formatting --- Directory.Packages.props | 3 + Integrations.slnx | 3 + .../NoaaClientSample/NoaaClientSample.csproj | 23 ++ samples/NoaaClientSample/OutputFormatter.cs | 201 +++++++++++++++ samples/NoaaClientSample/Program.cs | 186 ++++++++++++++ samples/NoaaClientSample/README.md | 238 ++++++++++++++++++ samples/NoaaClientSample/appsettings.json | 5 + src/Noaa/Dscovr/DscovrClient.cs | 68 +++-- src/Noaa/KpIndex/KpIndexClient.cs | 17 +- 9 files changed, 714 insertions(+), 30 deletions(-) create mode 100644 samples/NoaaClientSample/NoaaClientSample.csproj create mode 100644 samples/NoaaClientSample/OutputFormatter.cs create mode 100644 samples/NoaaClientSample/Program.cs create mode 100644 samples/NoaaClientSample/README.md create mode 100644 samples/NoaaClientSample/appsettings.json diff --git a/Directory.Packages.props b/Directory.Packages.props index f5b578d..4b13d31 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -17,11 +17,14 @@ + + + all diff --git a/Integrations.slnx b/Integrations.slnx index b8dd0fd..24d9293 100644 --- a/Integrations.slnx +++ b/Integrations.slnx @@ -11,6 +11,9 @@ + + + diff --git a/samples/NoaaClientSample/NoaaClientSample.csproj b/samples/NoaaClientSample/NoaaClientSample.csproj new file mode 100644 index 0000000..5a378dc --- /dev/null +++ b/samples/NoaaClientSample/NoaaClientSample.csproj @@ -0,0 +1,23 @@ + + + + Exe + AuroraScienceHub.Integrations.Samples.NoaaClientSample + + + + + + + + + + PreserveNewest + + + + + + + + diff --git a/samples/NoaaClientSample/OutputFormatter.cs b/samples/NoaaClientSample/OutputFormatter.cs new file mode 100644 index 0000000..f125fa9 --- /dev/null +++ b/samples/NoaaClientSample/OutputFormatter.cs @@ -0,0 +1,201 @@ +using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; +using Spectre.Console; +using AceMagnetometerRecord = AuroraScienceHub.Integrations.Noaa.Ace.Responses.MagnetometerRecord; +using DscovrMagnetometerRecord = AuroraScienceHub.Integrations.Noaa.Dscovr.Responses.MagnetometerRecord; +using AceSolarWindPlasmaRecord = AuroraScienceHub.Integrations.Noaa.Ace.Responses.SolarWindPlasmaRecord; +using DscovrSolarWindPlasmaRecord = AuroraScienceHub.Integrations.Noaa.Dscovr.Responses.SolarWindPlasmaRecord; + +namespace AuroraScienceHub.Integrations.Samples.NoaaClientSample; + +/// +/// Formats NOAA API data for console output using Spectre.Console +/// +internal static class OutputFormatter +{ + /// + /// Displays ACE magnetometer data in table format + /// + public static void DisplayAceMagnetometer(IReadOnlyList data, int limit) + { + var table = new Table() + .Border(TableBorder.Rounded) + .Title($"[yellow]ACE Magnetometer Data[/] [dim](showing {Math.Min(limit, data.Count)} of {data.Count})[/]") + .AddColumn("[cyan]DateTime[/]") + .AddColumn("[cyan]Status[/]") + .AddColumn("[cyan]Bx (nT)[/]") + .AddColumn("[cyan]By (nT)[/]") + .AddColumn("[cyan]Bz (nT)[/]") + .AddColumn("[cyan]Bt (nT)[/]") + .AddColumn("[cyan]Lat[/]") + .AddColumn("[cyan]Lon[/]"); + + foreach (var record in data.TakeLast(limit)) + { + table.AddRow( + record.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), + record.Status.ToString(), + Format(record.Bx), + Format(record.By), + Format(record.Bz), + Format(record.Bt), + Format(record.Latitude), + Format(record.Longitude)); + } + + AnsiConsole.Write(table); + } + + /// + /// Displays ACE SWEPAM data in table format + /// + public static void DisplayAceSwepam(IReadOnlyList data, int limit) + { + var table = new Table() + .Border(TableBorder.Rounded) + .Title($"[yellow]ACE SWEPAM Data[/] [dim](showing {Math.Min(limit, data.Count)} of {data.Count})[/]") + .AddColumn("[cyan]DateTime[/]") + .AddColumn("[cyan]Status[/]") + .AddColumn("[cyan]Proton Density[/]") + .AddColumn("[cyan]Bulk Speed[/]") + .AddColumn("[cyan]Ion Temp[/]"); + + foreach (var record in data.TakeLast(limit)) + { + table.AddRow( + record.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), + record.Status.ToString(), + Format(record.ProtonDensity), + Format(record.BulkSpeed), + Format(record.IonTemperature)); + } + + AnsiConsole.Write(table); + } + + /// + /// Displays DSCOVR magnetometer data in table format + /// + public static void DisplayDscovrMagnetometer(IReadOnlyList data, int limit) + { + var table = new Table() + .Border(TableBorder.Rounded) + .Title($"[yellow]DSCOVR Magnetometer Data[/] [dim](showing {Math.Min(limit, data.Count)} of {data.Count})[/]") + .AddColumn("[cyan]DateTime[/]") + .AddColumn("[cyan]Bx (nT)[/]") + .AddColumn("[cyan]By (nT)[/]") + .AddColumn("[cyan]Bz (nT)[/]") + .AddColumn("[cyan]Bt (nT)[/]") + .AddColumn("[cyan]Lat[/]") + .AddColumn("[cyan]Lon[/]"); + + foreach (var record in data.TakeLast(limit)) + { + table.AddRow( + record.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), + Format(record.Bx), + Format(record.By), + Format(record.Bz), + Format(record.Bt), + Format(record.Latitude), + Format(record.Longitude)); + } + + AnsiConsole.Write(table); + } + + /// + /// Displays DSCOVR solar wind plasma data in table format + /// + public static void DisplayDscovrPlasma(IReadOnlyList data, int limit) + { + var table = new Table() + .Border(TableBorder.Rounded) + .Title($"[yellow]DSCOVR Solar Wind Plasma Data[/] [dim](showing {Math.Min(limit, data.Count)} of {data.Count})[/]") + .AddColumn("[cyan]DateTime[/]") + .AddColumn("[cyan]Proton Density[/]") + .AddColumn("[cyan]Bulk Speed[/]") + .AddColumn("[cyan]Ion Temp[/]"); + + foreach (var record in data.TakeLast(limit)) + { + table.AddRow( + record.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), + Format(record.ProtonDensity), + Format(record.BulkSpeed), + Format(record.IonTemperature)); + } + + AnsiConsole.Write(table); + } + + /// + /// Displays KP index forecast data in table format + /// + public static void DisplayKpForecast(IReadOnlyList data, int limit, Func formatter) + { + var title = typeof(T).Name.Contains("27Day") ? "27-Day Forecast" : "3-Day Forecast"; + var table = new Table() + .Border(TableBorder.Rounded) + .Title($"[yellow]KP Index {title}[/] [dim](showing {Math.Min(limit, data.Count)} of {data.Count})[/]") + .AddColumn("[cyan]Date/Time[/]") + .AddColumn("[cyan]KP Index[/]") + .AddColumn("[cyan]Activity Level[/]"); + + var records = typeof(T).Name.Contains("27Day") ? data.Take(limit) : data.TakeLast(limit); + foreach (var record in records) + { + var (date, kp, level) = formatter(record); + table.AddRow(date, kp, GetColoredLevel(level)); + } + + AnsiConsole.Write(table); + } + + /// + /// Displays KP index nowcast data in table format + /// + public static void DisplayKpNowcast(IReadOnlyList data, int limit) + { + var table = new Table() + .Border(TableBorder.Rounded) + .Title($"[yellow]KP Index Nowcast[/] [dim](showing {Math.Min(limit, data.Count)} of {data.Count})[/]") + .AddColumn("[cyan]DateTime[/]") + .AddColumn("[cyan]KP Index[/]") + .AddColumn("[cyan]Stations[/]") + .AddColumn("[cyan]Activity Level[/]"); + + foreach (var record in data.TakeLast(limit)) + { + var level = GetActivityLevel((int)record.KpIndex); + table.AddRow( + record.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), + record.KpIndex.ToString("F2"), + record.StationsCount.ToString(), + GetColoredLevel(level)); + } + + AnsiConsole.Write(table); + } + + // Helper methods + private static string Format(float? value) => value?.ToString("F2") ?? "[dim]N/A[/]"; + + private static string GetActivityLevel(int kpIndex) => kpIndex switch + { + <= 2 => "Low", + <= 4 => "Moderate", + <= 6 => "Elevated", + <= 8 => "High", + _ => "Extreme" + }; + + private static string GetColoredLevel(string level) => level switch + { + "Low" => "[green]Low[/]", + "Moderate" => "[yellow]Moderate[/]", + "Elevated" => "[orange1]Elevated[/]", + "High" => "[red]High[/]", + "Extreme" => "[bold red]Extreme[/]", + _ => level + }; +} diff --git a/samples/NoaaClientSample/Program.cs b/samples/NoaaClientSample/Program.cs new file mode 100644 index 0000000..b8d8f5d --- /dev/null +++ b/samples/NoaaClientSample/Program.cs @@ -0,0 +1,186 @@ +using AuroraScienceHub.Integrations.Noaa; +using AuroraScienceHub.Integrations.Noaa.Ace; +using AuroraScienceHub.Integrations.Noaa.Dscovr; +using AuroraScienceHub.Integrations.Noaa.KpIndex; +using AuroraScienceHub.Integrations.Samples.NoaaClientSample; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Spectre.Console; + +// Setup DI and configuration +var builder = Host.CreateApplicationBuilder(args); +builder.Configuration.AddJsonFile("appsettings.json", optional: false); +builder.Services.AddNoaaClients(); +var host = builder.Build(); + +// Get NOAA clients from DI +var aceClient = host.Services.GetRequiredService(); +var dscovrClient = host.Services.GetRequiredService(); +var kpIndexClient = host.Services.GetRequiredService(); + +// Display header +AnsiConsole.Write(new FigletText("NOAA Client").Color(Color.Blue)); +AnsiConsole.MarkupLine("[dim]Interactive sample application for NOAA API clients[/]\n"); + +// Interactive menu loop +while (true) +{ + var choice = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("[green]Select an option:[/]") + .PageSize(10) + .AddChoices( + "ACE Magnetometer", + "ACE SWEPAM", + "DSCOVR Magnetometer", + "DSCOVR Solar Wind Plasma", + "KP Index 27-Day Forecast", + "KP Index 3-Day Forecast", + "KP Index Nowcast", + new string('-', 30), + "Execute All Requests", + "Exit")); + + if (choice == "Exit") break; + if (choice.StartsWith("---")) continue; + + AnsiConsole.WriteLine(); + + try + { + await AnsiConsole.Status() + .Spinner(Spinner.Known.Dots) + .SpinnerStyle(Style.Parse("green")) + .StartAsync("Fetching data...", async ctx => + { + await (choice switch + { + "ACE Magnetometer" => FetchAndDisplay(async () => + { + var data = await aceClient.GetMagnetometerDataAsync(CancellationToken.None); + OutputFormatter.DisplayAceMagnetometer(data, 10); + }), + "ACE SWEPAM" => FetchAndDisplay(async () => + { + var data = await aceClient.GetSwepamDataAsync(CancellationToken.None); + OutputFormatter.DisplayAceSwepam(data, 10); + }), + "DSCOVR Magnetometer" => FetchAndDisplay(async () => + { + var data = await dscovrClient.GetMagnetometerData2HAsync(CancellationToken.None); + OutputFormatter.DisplayDscovrMagnetometer(data, 10); + }), + "DSCOVR Solar Wind Plasma" => FetchAndDisplay(async () => + { + var data = await dscovrClient.GetSolarWindPlasmaData2HAsync(CancellationToken.None); + OutputFormatter.DisplayDscovrPlasma(data, 10); + }), + "KP Index 27-Day Forecast" => FetchAndDisplay(async () => + { + var data = await kpIndexClient.GetKpIndex27DayForecastAsync(CancellationToken.None); + OutputFormatter.DisplayKpForecast(data, 10, r => ( + r.Date.ToString("yyyy-MM-dd"), + r.KpIndex.ToString(), + GetActivityLevel(r.KpIndex))); + }), + "KP Index 3-Day Forecast" => FetchAndDisplay(async () => + { + var data = await kpIndexClient.GetKpIndex3DayForecastAsync(CancellationToken.None); + OutputFormatter.DisplayKpForecast(data, 10, r => ( + r.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), + r.KpIndex.ToString("F2"), + GetActivityLevel((int)r.KpIndex))); + }), + "KP Index Nowcast" => FetchAndDisplay(async () => + { + var data = await kpIndexClient.GetKpIndexNowcastAsync(CancellationToken.None); + OutputFormatter.DisplayKpNowcast(data, 10); + }), + "Execute All Requests" => ExecuteAllRequests(), + _ => Task.CompletedTask + }); + }); + } + catch (Exception ex) + { + AnsiConsole.MarkupLine($"[red]Error: {ex.Message.EscapeMarkup()}[/]"); + } + + AnsiConsole.WriteLine(); + AnsiConsole.MarkupLine("[dim]Press any key to continue...[/]"); + Console.ReadKey(true); + AnsiConsole.Clear(); +} + +AnsiConsole.MarkupLine("[blue]Goodbye![/]"); +return 0; + +async Task ExecuteAllRequests() +{ + AnsiConsole.MarkupLine("[yellow]Executing all NOAA API requests...[/]\n"); + + var tasks = new (string name, Func action)[] + { + ("ACE Magnetometer", async () => + { + var data = await aceClient.GetMagnetometerDataAsync(CancellationToken.None); + OutputFormatter.DisplayAceMagnetometer(data, 5); + }), + ("ACE SWEPAM", async () => + { + var data = await aceClient.GetSwepamDataAsync(CancellationToken.None); + OutputFormatter.DisplayAceSwepam(data, 5); + }), + ("DSCOVR Magnetometer", async () => + { + var data = await dscovrClient.GetMagnetometerData2HAsync(CancellationToken.None); + OutputFormatter.DisplayDscovrMagnetometer(data, 5); + }), + ("DSCOVR Solar Wind", async () => + { + var data = await dscovrClient.GetSolarWindPlasmaData2HAsync(CancellationToken.None); + OutputFormatter.DisplayDscovrPlasma(data, 5); + }), + ("KP Index Nowcast", async () => + { + var data = await kpIndexClient.GetKpIndexNowcastAsync(CancellationToken.None); + OutputFormatter.DisplayKpNowcast(data, 5); + }) + }; + + await AnsiConsole.Progress() + .AutoClear(false) + .Columns( + new TaskDescriptionColumn(), + new ProgressBarColumn(), + new PercentageColumn(), + new SpinnerColumn()) + .StartAsync(async ctx => + { + for (int i = 0; i < tasks.Length; i++) + { + var progressTask = ctx.AddTask($"[green]{tasks[i].name}[/]"); + await tasks[i].action(); + progressTask.Increment(100); + AnsiConsole.WriteLine(); + } + }); + + AnsiConsole.MarkupLine("\n[green]✓ All requests completed successfully![/]"); +} + +// Helper to fetch and display data +static async Task FetchAndDisplay(Func action) => await action(); + +// Helper method for activity level +static string GetActivityLevel(int kpIndex) => kpIndex switch +{ + <= 2 => "Low", + <= 4 => "Moderate", + <= 6 => "Elevated", + <= 8 => "High", + _ => "Extreme" +}; + + diff --git a/samples/NoaaClientSample/README.md b/samples/NoaaClientSample/README.md new file mode 100644 index 0000000..a7cef4e --- /dev/null +++ b/samples/NoaaClientSample/README.md @@ -0,0 +1,238 @@ +# NOAA Client Sample + +Консольное приложение для демонстрации работы с NOAA API клиентами с использованием System.CommandLine. + +## Описание + +Это приложение демонстрирует использование всех доступных методов клиентов NOAA через мощный CLI интерфейс: + +### ACE (Advanced Composition Explorer) Spacecraft +- **Magnetometer Data** - данные магнитометра (1-минутное усреднение) +- **SWEPAM Data** - данные Solar Wind Electron Proton Alpha Monitor + +### DSCOVR (Deep Space Climate Observatory) Spacecraft +- **Magnetometer Data** - данные магнитометра с различными временными диапазонами: + - 2 часа + - 1 день + - 3 дня + - 7 дней +- **Solar Wind Plasma Data** - данные солнечного ветра с различными временными диапазонами: + - 2 часа + - 1 день + - 3 дня + - 7 дней + +### KP Index +- **27-Day Forecast** - прогноз KP-индекса на 27 дней +- **3-Day Forecast** - прогноз KP-индекса на 3 дня +- **Nowcast** - текущие данные KP-индекса + +## Возможности + +✨ **Команды CLI** - мощный интерфейс командной строки с использованием System.CommandLine + +📊 **Табличный вывод** - форматированное отображение данных в виде таблиц + +🎨 **Уровни активности** - KP-индекс отображается с текстовыми метками уровня активности: +- Низкая (0-2) +- Умеренная (3-4) +- Повышенная (5-6) +- Высокая (7-8) +- Экстремальная (9+) + +⚙️ **Опции командной строки**: +- `--limit` / `-l` - количество записей для отображения +- `--verbose` / `-v` - полный вывод всех данных +- `--period` / `-p` - временной диапазон для DSCOVR (2h, 1d, 3d, 7d) + +⚡ **Массовое выполнение** - команда `all` для выполнения всех запросов последовательно + +🔍 **Встроенная справка** - используйте `--help` для любой команды + +## Требования + +- .NET 8.0 или выше +- Доступ к интернету (для подключения к NOAA API) + +## Конфигурация + +Приложение использует файл `appsettings.json` для настройки: + +```json +{ + "Noaa": { + "ServerUrl": "https://services.swpc.noaa.gov" + } +} +``` + +## Запуск + +### Общая справка + +```bash +dotnet run -- --help +``` + +### ACE Commands + +Получить данные магнитометра ACE: +```bash +dotnet run -- ace magnetometer +dotnet run -- ace magnetometer --limit 20 +dotnet run -- ace magnetometer --verbose +``` + +Получить данные SWEPAM ACE: +```bash +dotnet run -- ace swepam +dotnet run -- ace swepam -l 15 +``` + +### DSCOVR Commands + +Получить данные магнитометра DSCOVR: +```bash +dotnet run -- dscovr magnetometer --period 2h +dotnet run -- dscovr magnetometer -p 1d +dotnet run -- dscovr magnetometer -p 7d --verbose +``` + +Получить данные солнечного ветра DSCOVR: +```bash +dotnet run -- dscovr plasma --period 2h +dotnet run -- dscovr plasma -p 3d +``` + +### KP Index Commands + +Получить 27-дневный прогноз: +```bash +dotnet run -- kp 27day +dotnet run -- kp 27day --limit 15 +``` + +Получить 3-дневный прогноз: +```bash +dotnet run -- kp 3day +dotnet run -- kp 3day -v +``` + +Получить текущие данные (nowcast): +```bash +dotnet run -- kp nowcast +dotnet run -- kp nowcast -l 20 +``` + +### Выполнить все запросы + +```bash +dotnet run -- all +``` + +## Примеры использования + +### Быстрый старт + +```bash +# Получить последние данные ACE +dotnet run -- ace magnetometer + +# Получить данные DSCOVR за последний день +dotnet run -- dscovr magnetometer -p 1d + +# Посмотреть текущий KP-индекс +dotnet run -- kp nowcast +``` + +### Подробный анализ + +```bash +# Посмотреть все данные магнитометра ACE +dotnet run -- ace magnetometer --verbose + +# Получить последние 30 записей прогноза KP +dotnet run -- kp 3day --limit 30 + +# Выполнить все запросы сразу +dotnet run -- all +``` + +## Структура команд + +``` +noaa-client-sample +├── ace +│ ├── magnetometer [--limit] [--verbose] +│ └── swepam [--limit] [--verbose] +├── dscovr +│ ├── magnetometer --period {2h|1d|3d|7d} [--verbose] +│ └── plasma --period {2h|1d|3d|7d} [--verbose] +├── kp +│ ├── 27day [--limit] [--verbose] +│ ├── 3day [--limit] [--verbose] +│ └── nowcast [--limit] [--verbose] +└── all +``` + +## Архитектура + +Приложение построено с использованием лучших практик: + +- **System.CommandLine** - современная библиотека для создания CLI приложений +- **Dependency Injection** - использование Microsoft.Extensions.DependencyInjection +- **Configuration Management** - использование Microsoft.Extensions.Configuration +- **Typed HTTP Clients** - регистрация через AddHttpClient +- **Clean Architecture** - разделение на слои и использование интерфейсов +- **Async/Await** - асинхронная работа с API +- **Error Handling** - обработка ошибок и информативные сообщения + +## Преимущества System.CommandLine + +✅ **Автоматическая генерация справки** - встроенная поддержка `--help` + +✅ **Валидация аргументов** - автоматическая проверка типов и значений + +✅ **Автодополнение** - поддержка shell completion для bash, zsh, powershell + +✅ **Иерархия команд** - логическая структура команд и подкоманд + +✅ **Парсинг опций** - мощный парсер с поддержкой алиасов и значений по умолчанию + +✅ **Расширяемость** - легко добавлять новые команды и опции + +## Зависимости + +- **AuroraScienceHub.Integrations.Noaa** - основная библиотека клиентов NOAA +- **Microsoft.Extensions.Hosting** - для DI и конфигурации +- **System.CommandLine** - для создания CLI интерфейса + +## Формат вывода + +Все данные выводятся в виде текстовых таблиц с выравниванием колонок: + +``` +ACE Magnetometer Data (всего записей: 120) +------------------------------------------------------------------------------------------------------------------------ +DateTime Status Bx (nT) By (nT) Bz (nT) Bt (nT) Lat Lon +------------------------------------------------------------------------------------------------------------------------ +2026-02-02 10:00:00 0 2.30 -1.45 3.20 4.12 -0.50 1.20 +2026-02-02 10:01:00 0 2.35 -1.40 3.25 4.15 -0.48 1.22 +... +``` + +## Обработка ошибок + +Приложение корректно обрабатывает: +- Ошибки сети (HttpRequestException) +- Ошибки конфигурации +- Неверные параметры команд +- Общие исключения + +Все ошибки выводятся красным цветом с понятными сообщениями. + +## Лицензия + +См. файл LICENSE в корне репозитория. + + diff --git a/samples/NoaaClientSample/appsettings.json b/samples/NoaaClientSample/appsettings.json new file mode 100644 index 0000000..b89b4ad --- /dev/null +++ b/samples/NoaaClientSample/appsettings.json @@ -0,0 +1,5 @@ +{ + "Noaa": { + "ServerUrl": "https://services.swpc.noaa.gov" + } +} diff --git a/src/Noaa/Dscovr/DscovrClient.cs b/src/Noaa/Dscovr/DscovrClient.cs index 4376817..fcecc69 100644 --- a/src/Noaa/Dscovr/DscovrClient.cs +++ b/src/Noaa/Dscovr/DscovrClient.cs @@ -18,50 +18,76 @@ public DscovrClient( } public async Task> GetMagnetometerData2HAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-2-hour.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/mag-2-hour.json"); + return await GetMagnetometerDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetMagnetometerData1DAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-1-day.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/mag-1-day.json"); + return await GetMagnetometerDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetMagnetometerData3DAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-3-day.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/mag-3-day.json"); + return await GetMagnetometerDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetMagnetometerData7DAsync(CancellationToken cancellationToken) - => await GetMagnetometerDataAsync("/products/solar-wind/mag-7-day.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/mag-7-day.json"); + return await GetMagnetometerDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetSolarWindPlasmaData2HAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-2-hour.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/plasma-2-hour.json"); + return await GetSolarWindPlasmaDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetSolarWindPlasmaData1DAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-1-day.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/plasma-1-day.json"); + return await GetSolarWindPlasmaDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetSolarWindPlasmaData3DAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-3-day.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/plasma-3-day.json"); + return await GetSolarWindPlasmaDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } public async Task> GetSolarWindPlasmaData7DAsync(CancellationToken cancellationToken) - => await GetSolarWindPlasmaDataAsync("/products/solar-wind/plasma-7-day.json", cancellationToken) - .ConfigureAwait(false); + { + var url = new Uri(_baseUrl, "products/solar-wind/plasma-7-day.json"); + return await GetSolarWindPlasmaDataAsync(url, cancellationToken) + .ConfigureAwait(false); + } - private async Task> GetMagnetometerDataAsync(string relativeUri, CancellationToken cancellationToken) + private async Task> GetMagnetometerDataAsync( + Uri url, + CancellationToken cancellationToken) { - var url = new Uri(_baseUrl, relativeUri); - var response = await _httpClient.GetAsync(url, cancellationToken); + var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var text = await response.Content.ReadAsStringAsync(cancellationToken); return MagnetometerDataParser.Parse(text); } - private async Task> GetSolarWindPlasmaDataAsync(string relativeUri, CancellationToken cancellationToken) + private async Task> GetSolarWindPlasmaDataAsync( + Uri url, + CancellationToken cancellationToken) { - var url = new Uri(_baseUrl, relativeUri); var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var text = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); diff --git a/src/Noaa/KpIndex/KpIndexClient.cs b/src/Noaa/KpIndex/KpIndexClient.cs index ca85277..ae14f8f 100644 --- a/src/Noaa/KpIndex/KpIndexClient.cs +++ b/src/Noaa/KpIndex/KpIndexClient.cs @@ -1,49 +1,48 @@ using AuroraScienceHub.Integrations.Noaa.KpIndex.Extensions; using AuroraScienceHub.Integrations.Noaa.KpIndex.Responses; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace AuroraScienceHub.Integrations.Noaa.KpIndex; internal sealed class KpIndexClient : IKpIndexClient { - private readonly ILogger _logger; private readonly HttpClient _client; private readonly Uri _baseUrl; public KpIndexClient( - ILogger logger, HttpClient client, IOptions options) { - _logger = logger; _client = client; _baseUrl = options.Value.RequiredServerUrl; } public async Task> GetKpIndex27DayForecastAsync(CancellationToken cancellationToken) { - var text = await GetStringOrDefaultAsync("text/27-day-outlook.txt", cancellationToken).ConfigureAwait(false); + var url = new Uri(_baseUrl, "text/27-day-outlook.txt"); + var text = await GetStringOrDefaultAsync(url, cancellationToken).ConfigureAwait(false); return string.IsNullOrWhiteSpace(text) ? [] : KpIndex27DayDataParser.Parse(text); } public async Task> GetKpIndex3DayForecastAsync(CancellationToken cancellationToken) { - var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index-forecast.json", cancellationToken).ConfigureAwait(false); + var url = new Uri(_baseUrl, "products/noaa-planetary-k-index-forecast.json"); + var text = await GetStringOrDefaultAsync(url, cancellationToken).ConfigureAwait(false); return string.IsNullOrWhiteSpace(text) ? [] : KpIndex3DayDataParser.Parse(text); } public async Task> GetKpIndexNowcastAsync(CancellationToken cancellationToken) { - var text = await GetStringOrDefaultAsync("products/noaa-planetary-k-index.json", cancellationToken).ConfigureAwait(false); + var url = new Uri(_baseUrl, "products/noaa-planetary-k-index.json"); + var text = await GetStringOrDefaultAsync(url, cancellationToken).ConfigureAwait(false); return string.IsNullOrWhiteSpace(text) ? [] : KpIndexNowcastDataParser.Parse(text); } - private async Task GetStringOrDefaultAsync(string relativeUrl, CancellationToken cancellationToken) + private async Task GetStringOrDefaultAsync(Uri url, CancellationToken cancellationToken) { - var url = new Uri(_baseUrl, relativeUrl); var response = await _client.GetAsync(url, cancellationToken).ConfigureAwait(false); response.EnsureSuccessStatusCode(); + return await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); } } From b89ae0c38802d3e0ed1364d41cfe082c5d5fc635 Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Mon, 2 Feb 2026 19:45:16 +0300 Subject: [PATCH 11/19] Update README to enhance clarity and reflect changes in NOAA client application features --- samples/NoaaClientSample/README.md | 261 +++++++++-------------------- 1 file changed, 78 insertions(+), 183 deletions(-) diff --git a/samples/NoaaClientSample/README.md b/samples/NoaaClientSample/README.md index a7cef4e..2c0e487 100644 --- a/samples/NoaaClientSample/README.md +++ b/samples/NoaaClientSample/README.md @@ -1,62 +1,49 @@ # NOAA Client Sample -Консольное приложение для демонстрации работы с NOAA API клиентами с использованием System.CommandLine. +An interactive console application demonstrating the NOAA API clients using Spectre.Console. -## Описание +## Overview -Это приложение демонстрирует использование всех доступных методов клиентов NOAA через мощный CLI интерфейс: +This sample demonstrates all available NOAA client methods through an interactive menu-driven interface: ### ACE (Advanced Composition Explorer) Spacecraft -- **Magnetometer Data** - данные магнитометра (1-минутное усреднение) -- **SWEPAM Data** - данные Solar Wind Electron Proton Alpha Monitor +- **Magnetometer Data** - 1-minute averaged magnetic field measurements +- **SWEPAM Data** - Solar Wind Electron Proton Alpha Monitor measurements ### DSCOVR (Deep Space Climate Observatory) Spacecraft -- **Magnetometer Data** - данные магнитометра с различными временными диапазонами: - - 2 часа - - 1 день - - 3 дня - - 7 дней -- **Solar Wind Plasma Data** - данные солнечного ветра с различными временными диапазонами: - - 2 часа - - 1 день - - 3 дня - - 7 дней +- **Magnetometer Data** - Magnetic field measurements (2-hour window) +- **Solar Wind Plasma Data** - Solar wind measurements (2-hour window) ### KP Index -- **27-Day Forecast** - прогноз KP-индекса на 27 дней -- **3-Day Forecast** - прогноз KP-индекса на 3 дня -- **Nowcast** - текущие данные KP-индекса +- **27-Day Forecast** - Extended KP index forecast +- **3-Day Forecast** - Short-term KP index forecast +- **Nowcast** - Real-time KP index measurements -## Возможности +## Features -✨ **Команды CLI** - мощный интерфейс командной строки с использованием System.CommandLine +✨ **Interactive Menu** - Easy-to-use selection interface powered by Spectre.Console -📊 **Табличный вывод** - форматированное отображение данных в виде таблиц +📊 **Formatted Tables** - Beautiful table output with colors and borders -🎨 **Уровни активности** - KP-индекс отображается с текстовыми метками уровня активности: -- Низкая (0-2) -- Умеренная (3-4) -- Повышенная (5-6) -- Высокая (7-8) -- Экстремальная (9+) +🎨 **Activity Levels** - KP index displayed with color-coded activity levels: +- Low (0-2) - Green +- Moderate (3-4) - Yellow +- Elevated (5-6) - Orange +- High (7-8) - Red +- Extreme (9+) - Bold Red -⚙️ **Опции командной строки**: -- `--limit` / `-l` - количество записей для отображения -- `--verbose` / `-v` - полный вывод всех данных -- `--period` / `-p` - временной диапазон для DSCOVR (2h, 1d, 3d, 7d) +⚡ **Bulk Execution** - Execute all API requests with a single menu option -⚡ **Массовое выполнение** - команда `all` для выполнения всех запросов последовательно +🔄 **Loading Indicators** - Visual feedback with spinners and progress bars -🔍 **Встроенная справка** - используйте `--help` для любой команды +## Requirements -## Требования +- .NET 8.0 or higher +- Internet connection (for NOAA API access) -- .NET 8.0 или выше -- Доступ к интернету (для подключения к NOAA API) +## Configuration -## Конфигурация - -Приложение использует файл `appsettings.json` для настройки: +The application uses `appsettings.json` for configuration: ```json { @@ -66,173 +53,81 @@ } ``` -## Запуск - -### Общая справка - -```bash -dotnet run -- --help -``` - -### ACE Commands +## Usage -Получить данные магнитометра ACE: -```bash -dotnet run -- ace magnetometer -dotnet run -- ace magnetometer --limit 20 -dotnet run -- ace magnetometer --verbose -``` +Run the application: -Получить данные SWEPAM ACE: ```bash -dotnet run -- ace swepam -dotnet run -- ace swepam -l 15 +dotnet run ``` -### DSCOVR Commands - -Получить данные магнитометра DSCOVR: -```bash -dotnet run -- dscovr magnetometer --period 2h -dotnet run -- dscovr magnetometer -p 1d -dotnet run -- dscovr magnetometer -p 7d --verbose -``` +You'll see an interactive menu with the following options: -Получить данные солнечного ветра DSCOVR: -```bash -dotnet run -- dscovr plasma --period 2h -dotnet run -- dscovr plasma -p 3d -``` +1. **ACE Magnetometer** - Fetch ACE spacecraft magnetometer data +2. **ACE SWEPAM** - Fetch ACE solar wind plasma data +3. **DSCOVR Magnetometer** - Fetch DSCOVR magnetometer data +4. **DSCOVR Solar Wind Plasma** - Fetch DSCOVR plasma data +5. **KP Index 27-Day Forecast** - View extended KP forecast +6. **KP Index 3-Day Forecast** - View short-term KP forecast +7. **KP Index Nowcast** - View current KP measurements +8. **Execute All Requests** - Run all queries sequentially with progress tracking +9. **Exit** - Quit the application -### KP Index Commands +Simply use arrow keys to navigate and press Enter to select an option. -Получить 27-дневный прогноз: -```bash -dotnet run -- kp 27day -dotnet run -- kp 27day --limit 15 -``` +## Architecture -Получить 3-дневный прогноз: -```bash -dotnet run -- kp 3day -dotnet run -- kp 3day -v -``` +The application follows best practices: -Получить текущие данные (nowcast): -```bash -dotnet run -- kp nowcast -dotnet run -- kp nowcast -l 20 -``` +- **Dependency Injection** - Uses Microsoft.Extensions.DependencyInjection +- **Configuration Management** - Leverages Microsoft.Extensions.Configuration +- **Typed HTTP Clients** - Registered via AddHttpClient +- **Async/Await** - All API calls are asynchronous +- **Error Handling** - Graceful error handling with user-friendly messages +- **Separation of Concerns** - UI formatting separated in OutputFormatter class -### Выполнить все запросы +## Project Structure -```bash -dotnet run -- all ``` - -## Примеры использования - -### Быстрый старт - -```bash -# Получить последние данные ACE -dotnet run -- ace magnetometer - -# Получить данные DSCOVR за последний день -dotnet run -- dscovr magnetometer -p 1d - -# Посмотреть текущий KP-индекс -dotnet run -- kp nowcast +NoaaClientSample/ +├── Program.cs # Main application with interactive menu +├── OutputFormatter.cs # Table formatting utilities +├── appsettings.json # Application configuration +└── NoaaClientSample.csproj # Project file ``` -### Подробный анализ - -```bash -# Посмотреть все данные магнитометра ACE -dotnet run -- ace magnetometer --verbose - -# Получить последние 30 записей прогноза KP -dotnet run -- kp 3day --limit 30 +## Dependencies -# Выполнить все запросы сразу -dotnet run -- all -``` +- **AuroraScienceHub.Integrations.Noaa** - NOAA API client library +- **Microsoft.Extensions.Hosting** - For DI and configuration +- **Spectre.Console** - For beautiful console UI -## Структура команд +## Sample Output ``` -noaa-client-sample -├── ace -│ ├── magnetometer [--limit] [--verbose] -│ └── swepam [--limit] [--verbose] -├── dscovr -│ ├── magnetometer --period {2h|1d|3d|7d} [--verbose] -│ └── plasma --period {2h|1d|3d|7d} [--verbose] -├── kp -│ ├── 27day [--limit] [--verbose] -│ ├── 3day [--limit] [--verbose] -│ └── nowcast [--limit] [--verbose] -└── all -``` - -## Архитектура - -Приложение построено с использованием лучших практик: - -- **System.CommandLine** - современная библиотека для создания CLI приложений -- **Dependency Injection** - использование Microsoft.Extensions.DependencyInjection -- **Configuration Management** - использование Microsoft.Extensions.Configuration -- **Typed HTTP Clients** - регистрация через AddHttpClient -- **Clean Architecture** - разделение на слои и использование интерфейсов -- **Async/Await** - асинхронная работа с API -- **Error Handling** - обработка ошибок и информативные сообщения - -## Преимущества System.CommandLine - -✅ **Автоматическая генерация справки** - встроенная поддержка `--help` + _ _ ___ _ _ ____ _ _ _ + | \ | |/ _ \ / \ / \ / ___| (_) ___ _ __ | |_ + | \| | | | |/ _ \/ _ \ | | | | |/ _ \ '_ \| __| + | |\ | |_| / ___ \ ___ \ | |___| | | __/ | | | |_ + |_| \_|\___/_/ \_\ \_\ \____|_|_|\___|_| |_|\__| -✅ **Валидация аргументов** - автоматическая проверка типов и значений +Interactive sample application for NOAA API clients -✅ **Автодополнение** - поддержка shell completion для bash, zsh, powershell - -✅ **Иерархия команд** - логическая структура команд и подкоманд - -✅ **Парсинг опций** - мощный парсер с поддержкой алиасов и значений по умолчанию - -✅ **Расширяемость** - легко добавлять новые команды и опции - -## Зависимости - -- **AuroraScienceHub.Integrations.Noaa** - основная библиотека клиентов NOAA -- **Microsoft.Extensions.Hosting** - для DI и конфигурации -- **System.CommandLine** - для создания CLI интерфейса - -## Формат вывода - -Все данные выводятся в виде текстовых таблиц с выравниванием колонок: - -``` -ACE Magnetometer Data (всего записей: 120) ------------------------------------------------------------------------------------------------------------------------- -DateTime Status Bx (nT) By (nT) Bz (nT) Bt (nT) Lat Lon ------------------------------------------------------------------------------------------------------------------------- -2026-02-02 10:00:00 0 2.30 -1.45 3.20 4.12 -0.50 1.20 -2026-02-02 10:01:00 0 2.35 -1.40 3.25 4.15 -0.48 1.22 -... +? Select an option: › +❯ ACE Magnetometer + ACE SWEPAM + DSCOVR Magnetometer + DSCOVR Solar Wind Plasma + KP Index 27-Day Forecast + KP Index 3-Day Forecast + KP Index Nowcast + ────────────────────────────── + Execute All Requests + Exit ``` -## Обработка ошибок - -Приложение корректно обрабатывает: -- Ошибки сети (HttpRequestException) -- Ошибки конфигурации -- Неверные параметры команд -- Общие исключения - -Все ошибки выводятся красным цветом с понятными сообщениями. - -## Лицензия +## License -См. файл LICENSE в корне репозитория. +See LICENSE file in the repository root. From 66d9985e02347637e759aa1c9f237f29673a151f Mon Sep 17 00:00:00 2001 From: Ermilov Aleksei Date: Tue, 3 Feb 2026 20:40:41 +0300 Subject: [PATCH 12/19] Refactor NOAA integration to use NoaaClient namespace and update project structure --- Integrations.slnx | 2 +- PackageLicenses.txt | 115 ------------------ README.md | 2 +- ...aScienceHub.Integrations.Benchmarks.csproj | 9 +- .../Ace/AceMagnetometerDataParserBenchmark.cs | 6 +- .../AceSolarWindPlasmaDataParserBenchmark.cs | 8 +- .../Ace/Samples/AceMagnetometerSample.txt | 0 .../Ace/Samples/AceSwepamSample.txt | 0 .../DscovrMagnetometerDataParserBenchmark.cs | 6 +- ...scovrSolarWindPlasmaDataParserBenchmark.cs | 8 +- .../Samples/DscovrMagnetometerSample.json | 0 .../Samples/DscovrSolarWindPlasmaSample.json | 0 package.json | 5 - .../NoaaClientSample/NoaaClientSample.csproj | 2 +- samples/NoaaClientSample/OutputFormatter.cs | 10 +- samples/NoaaClientSample/Program.cs | 8 +- samples/NoaaClientSample/README.md | 10 +- src/Noaa/Noaa.csproj | 14 --- src/{Noaa => NoaaClient}/Ace/AceClient.cs | 6 +- .../Ace/Extensions/MagnetometerDataParser.cs | 4 +- .../Extensions/SolarWindPlasmaDataParser.cs | 4 +- src/{Noaa => NoaaClient}/Ace/IAceClient.cs | 4 +- .../Ace/Responses/MagnetometerRecord.cs | 2 +- .../Ace/Responses/SolarWindPlasmaRecord.cs | 2 +- .../Dscovr/DscovrClient.cs | 6 +- .../Extensions/MagnetometerDataParser.cs | 4 +- .../Extensions/SolarWindPlasmaDataParser.cs | 4 +- .../Dscovr/IDscovrClient.cs | 4 +- .../Dscovr/Responses/MagnetometerRecord.cs | 2 +- .../Dscovr/Responses/SolarWindPlasmaRecord.cs | 2 +- .../Extensions/KpIndex27DayDataParser.cs | 4 +- .../Extensions/KpIndex3DayDataParser.cs | 4 +- .../Extensions/KpIndexNowcastDataParser.cs | 4 +- .../KpIndex/IKpIndexClient.cs | 4 +- .../KpIndex/KpIndexClient.cs | 6 +- .../KpIndex/Responses/KpIndex27DayResponse.cs | 2 +- .../KpIndex/Responses/KpIndex3DayResponse.cs | 2 +- .../Responses/KpIndexNowcastResponse.cs | 2 +- src/NoaaClient/NoaaClient.csproj | 23 ++++ src/{Noaa => NoaaClient}/NoaaClientOptions.cs | 4 +- src/{Noaa => NoaaClient}/README.md | 0 .../ServiceCollectionExtensions.cs | 8 +- .../Ace/MagnetometerDataParserTests.cs | 8 +- .../Ace/Samples/AceMagnetometerSample.txt | 0 .../Ace/Samples/AceSwepamSample.txt | 0 .../Ace/SolarWindPlasmaDataParserTests.cs | 8 +- .../Dscovr/MagnetometerDataParserTests.cs | 8 +- .../Samples/DscovrMagnetometerSample.json | 0 .../Samples/DscovrSolarWindPlasmaSample.json | 0 .../Dscovr/SolarWindPlasmaDataParserTests.cs | 8 +- .../KpIndex/KpIndex27DayDataParserTests.cs | 8 +- .../KpIndex/KpIndex3DayDataParserTests.cs | 8 +- .../KpIndex/KpIndexNowcastDataParserTests.cs | 8 +- .../Samples/KpIndex27DayForecastSample.txt | 0 .../Samples/KpIndex3DayForecastSample.json | 0 .../KpIndex/Samples/KpIndexNowcastSample.json | 0 tests/UnitTests/UnitTests.csproj | 8 +- .../Utils/EmbeddedResourceDataAttribute.cs | 2 +- 58 files changed, 133 insertions(+), 245 deletions(-) delete mode 100644 PackageLicenses.txt rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Ace/AceMagnetometerDataParserBenchmark.cs (81%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Ace/AceSolarWindPlasmaDataParserBenchmark.cs (73%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Ace/Samples/AceMagnetometerSample.txt (100%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Ace/Samples/AceSwepamSample.txt (100%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Dscovr/DscovrMagnetometerDataParserBenchmark.cs (80%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Dscovr/DscovrSolarWindPlasmaDataParserBenchmark.cs (72%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Dscovr/Samples/DscovrMagnetometerSample.json (100%) rename benchmarks/AuroraScienceHub.Integrations.Benchmarks/{Noaa => NoaaClient}/Dscovr/Samples/DscovrSolarWindPlasmaSample.json (100%) delete mode 100644 package.json delete mode 100644 src/Noaa/Noaa.csproj rename src/{Noaa => NoaaClient}/Ace/AceClient.cs (88%) rename src/{Noaa => NoaaClient}/Ace/Extensions/MagnetometerDataParser.cs (95%) rename src/{Noaa => NoaaClient}/Ace/Extensions/SolarWindPlasmaDataParser.cs (95%) rename src/{Noaa => NoaaClient}/Ace/IAceClient.cs (79%) rename src/{Noaa => NoaaClient}/Ace/Responses/MagnetometerRecord.cs (91%) rename src/{Noaa => NoaaClient}/Ace/Responses/SolarWindPlasmaRecord.cs (90%) rename src/{Noaa => NoaaClient}/Dscovr/DscovrClient.cs (95%) rename src/{Noaa => NoaaClient}/Dscovr/Extensions/MagnetometerDataParser.cs (95%) rename src/{Noaa => NoaaClient}/Dscovr/Extensions/SolarWindPlasmaDataParser.cs (95%) rename src/{Noaa => NoaaClient}/Dscovr/IDscovrClient.cs (93%) rename src/{Noaa => NoaaClient}/Dscovr/Responses/MagnetometerRecord.cs (90%) rename src/{Noaa => NoaaClient}/Dscovr/Responses/SolarWindPlasmaRecord.cs (87%) rename src/{Noaa => NoaaClient}/KpIndex/Extensions/KpIndex27DayDataParser.cs (95%) rename src/{Noaa => NoaaClient}/KpIndex/Extensions/KpIndex3DayDataParser.cs (93%) rename src/{Noaa => NoaaClient}/KpIndex/Extensions/KpIndexNowcastDataParser.cs (94%) rename src/{Noaa => NoaaClient}/KpIndex/IKpIndexClient.cs (83%) rename src/{Noaa => NoaaClient}/KpIndex/KpIndexClient.cs (90%) rename src/{Noaa => NoaaClient}/KpIndex/Responses/KpIndex27DayResponse.cs (76%) rename src/{Noaa => NoaaClient}/KpIndex/Responses/KpIndex3DayResponse.cs (77%) rename src/{Noaa => NoaaClient}/KpIndex/Responses/KpIndexNowcastResponse.cs (83%) create mode 100644 src/NoaaClient/NoaaClient.csproj rename src/{Noaa => NoaaClient}/NoaaClientOptions.cs (86%) rename src/{Noaa => NoaaClient}/README.md (100%) rename src/{Noaa => NoaaClient}/ServiceCollectionExtensions.cs (76%) rename tests/UnitTests/{Noaa => NoaaClient}/Ace/MagnetometerDataParserTests.cs (86%) rename tests/UnitTests/{Noaa => NoaaClient}/Ace/Samples/AceMagnetometerSample.txt (100%) rename tests/UnitTests/{Noaa => NoaaClient}/Ace/Samples/AceSwepamSample.txt (100%) rename tests/UnitTests/{Noaa => NoaaClient}/Ace/SolarWindPlasmaDataParserTests.cs (85%) rename tests/UnitTests/{Noaa => NoaaClient}/Dscovr/MagnetometerDataParserTests.cs (81%) rename tests/UnitTests/{Noaa => NoaaClient}/Dscovr/Samples/DscovrMagnetometerSample.json (100%) rename tests/UnitTests/{Noaa => NoaaClient}/Dscovr/Samples/DscovrSolarWindPlasmaSample.json (100%) rename tests/UnitTests/{Noaa => NoaaClient}/Dscovr/SolarWindPlasmaDataParserTests.cs (80%) rename tests/UnitTests/{Noaa => NoaaClient}/KpIndex/KpIndex27DayDataParserTests.cs (82%) rename tests/UnitTests/{Noaa => NoaaClient}/KpIndex/KpIndex3DayDataParserTests.cs (82%) rename tests/UnitTests/{Noaa => NoaaClient}/KpIndex/KpIndexNowcastDataParserTests.cs (85%) rename tests/UnitTests/{Noaa => NoaaClient}/KpIndex/Samples/KpIndex27DayForecastSample.txt (100%) rename tests/UnitTests/{Noaa => NoaaClient}/KpIndex/Samples/KpIndex3DayForecastSample.json (100%) rename tests/UnitTests/{Noaa => NoaaClient}/KpIndex/Samples/KpIndexNowcastSample.json (100%) diff --git a/Integrations.slnx b/Integrations.slnx index 24d9293..2ac3239 100644 --- a/Integrations.slnx +++ b/Integrations.slnx @@ -28,7 +28,7 @@ - + diff --git a/PackageLicenses.txt b/PackageLicenses.txt deleted file mode 100644 index e5affea..0000000 --- a/PackageLicenses.txt +++ /dev/null @@ -1,115 +0,0 @@ -+------------------------------------------------------------+-------------------------+----------------------------+--------------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ -| Package | Version | License Information Origin | License Expression | License Url | Copyright | Authors | Package Project Url | Error | Error Context | -+------------------------------------------------------------+-------------------------+----------------------------+--------------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ -| App.Metrics.Abstractions | 4.3.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Allan Hardy 2016 | Allan Hardy and Contributors | https://app-metrics.io/ | | | -| Asp.Versioning.Http | 8.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © .NET Foundation. All rights reserved. | .NET Foundation and Contributors | https://github.com/dotnet/aspnet-api-versioning/wiki | | | -| Asp.Versioning.Mvc | 8.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © .NET Foundation. All rights reserved. | .NET Foundation and Contributors | https://github.com/dotnet/aspnet-api-versioning/wiki | | | -| Asp.Versioning.Mvc.ApiExplorer | 8.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © .NET Foundation. All rights reserved. | .NET Foundation and Contributors | https://github.com/dotnet/aspnet-api-versioning/wiki | | | -| Aspire.Dashboard.Sdk.osx-arm64 | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Aspire.Hosting | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Aspire.Hosting.AppHost | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Aspire.Hosting.Garnet | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Aspire.Hosting.Orchestration.osx-arm64 | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Aspire.Hosting.PostgreSQL | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Aspire.Hosting.RabbitMQ | 9.1.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| AspNetCore.HealthChecks.NpgSql | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | | Xabaril Contributors | https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks | | | -| AspNetCore.HealthChecks.Sqlite | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | | Xabaril Contributors | https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks | | | -| AspNetCore.HealthChecks.UI.Client | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | | Xabaril Contributors | https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks | | | -| AuroraScienceHub.SWeather.Draw.Plotting | 1.10.132 | Expression | GPL-3.0-or-later | https://licenses.nuget.org/GPL-3.0-or-later | Copyright 2025 © AuroraScienceHub. All rights reserved | AuroraScienceHub | https://github.com/Aurora-Science-Hub/SWeather-draw | | | -| AuroraScienceHub.SWeather.Physics.CouplingFunctions | 1.1.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2024 © AuroraScienceHub. All rights reserved | AuroraScienceHub | https://github.com/Aurora-Science-Hub/SWeather-physics | | | -| AutoFixture.AutoMoq | 4.18.1 | Expression | MIT | https://licenses.nuget.org/MIT | Copyright © Ploeh 2011 | Mark Seemann,AutoFixture | https://github.com/AutoFixture/AutoFixture | | | -| BenchmarkDotNet | 0.14.0 | Expression | MIT | https://licenses.nuget.org/MIT | .NET Foundation and contributors | .NET Foundation and contributors | https://github.com/dotnet/BenchmarkDotNet | | | -| ChatGptNet | 3.3.9 | Expression | MIT | https://licenses.nuget.org/MIT | | Marco Minerva | https://github.com/marcominerva/ChatGptNet | | | -| ClickHouse.Client | 7.8.2 | Expression | MIT | https://licenses.nuget.org/MIT | | Oleg Kozlyuk | https://github.com/DarkWanderer/ClickHouse.Client | | | -| coverlet.collector | 6.0.2 | Expression | MIT | https://licenses.nuget.org/MIT | | tonerdo | https://github.com/coverlet-coverage/coverlet | | | -| Dapper | 2.1.35 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | 2019 Stack Exchange, Inc. | Sam Saffron,Marc Gravell,Nick Craver | https://github.com/DapperLib/Dapper | | | -| DeepL.net | 1.15.0 | Expression | MIT | https://licenses.nuget.org/MIT | | DeepL SE | https://www.deepl.com/pro-api | | | -| EFCore.NamingConventions | 9.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2023 © Shay Rojansky | Shay Rojansky | | | | -| FluentAssertions | 6.12.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright Dennis Doomen 2010-2024 | Dennis Doomen,Jonas Nyrup | https://www.fluentassertions.com/ | | | -| HtmlAgilityPack | 1.11.71 | Expression | MIT | https://licenses.nuget.org/MIT | Copyright © ZZZ Projects Inc. | ZZZ Projects,Simon Mourrier,Jeff Klawiter,Stephan Grell | http://html-agility-pack.net/ | | | -| MassTransit | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | -| MassTransit.Abstractions | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | -| MassTransit.EntityFrameworkCore | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | -| MassTransit.RabbitMQ | 8.4.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2007-2024 Chris Patterson | Chris Patterson | https://masstransit.io/ | | | -| Mediator.Abstractions | 3.0.1 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright 2022 Martin Othamar | Martin Othamar | https://github.com/martinothamar/Mediator | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Framework/AspNetCore/AspNetCore.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Host/Host.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataImport/Application/Application.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataImport/InternalClient/InternalClient.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataProcess/InternalClient/InternalClient.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PreliminaryDataProcess/Application/Application.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/Visualization/Application/Application.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/PopularScience/Application/Application.csproj | -| | | | | | | | | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Modules/Ice/Application/Application.csproj | -| Mediator.SourceGenerator | 3.0.1 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright 2022 Martin Othamar | Martin Othamar | https://github.com/martinothamar/Mediator | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/src/Host/Host.csproj | -| Meziantou.Extensions.Logging.Xunit.v3 | 1.1.2 | Expression | MIT | https://licenses.nuget.org/MIT | | Meziantou | https://github.com/meziantou/Meziantou.Framework | | | -| Microsoft.AspNetCore.Mvc.Testing | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | -| Microsoft.AspNetCore.OpenApi | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | -| Microsoft.CodeAnalysis | 4.9.2 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | -| Microsoft.CodeAnalysis | 4.13.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | -| Microsoft.CodeAnalysis.Analyzers | 3.3.4 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn-analyzers | | | -| Microsoft.CodeAnalysis.Analyzers | 3.11.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn-analyzers | | | -| Microsoft.CodeAnalysis.Workspaces.Common | 4.13.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | -| Microsoft.CodeAnalysis.Workspaces.MSBuild | 4.13.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/roslyn | | | -| Microsoft.EntityFrameworkCore | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | -| Microsoft.EntityFrameworkCore.Design | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | -| Microsoft.EntityFrameworkCore.Relational | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | -| Microsoft.EntityFrameworkCore.Tools | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://docs.microsoft.com/ef/core/ | | | -| Microsoft.Extensions.Caching.Abstractions | 9.0.2 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Caching.Hybrid | 9.2.0-preview.1.25105.6 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Caching.StackExchangeRedis | 9.0.2 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | -| Microsoft.Extensions.Configuration | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Configuration.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Configuration.Binder | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Configuration.CommandLine | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Configuration.EnvironmentVariables | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Configuration.FileExtensions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Configuration.Json | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.DependencyInjection | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.DependencyInjection.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | -| Microsoft.Extensions.Diagnostics.Testing | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Hosting.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Http | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Http.Resilience | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Localization.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://asp.net/ | | | -| Microsoft.Extensions.Logging | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Logging.Abstractions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Options | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.Options.ConfigurationExtensions | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.Extensions.ServiceDiscovery | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/aspire | | | -| Microsoft.Extensions.TimeProvider.Testing | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Microsoft.NET.Test.Sdk | 17.11.1 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/microsoft/vstest | | | -| Moq | 4.20.72 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors. All rights reserved. | Daniel Cazzulino, kzu | https://github.com/moq/moq | | | -| NetTopologySuite | 2.6.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright © 2006 - 2025 NetTopologySuite - Team, Diego Guidi, John Diss (www.newgrove.com), Felix Obermaier (www.ivv-aachen.de), Todd Jackson, Joe Amenta | NetTopologySuite - Team | | | | -| NetTopologySuite.IO.GeoJSON | 4.0.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright © 2023 NetTopologySuite - Team | NetTopologySuite - Team | | | | -| NetTopologySuite.IO.PostGis | 2.1.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright © 2021 NetTopologySuite - Team | NetTopologySuite - Team | | | | -| Npgsql.EntityFrameworkCore.PostgreSQL | 9.0.1 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky,Austin Drenski,Yoh Deadfall | https://github.com/npgsql/efcore.pg | | | -| Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite | 9.0.1 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky | https://github.com/npgsql/efcore.pg | | | -| Npgsql.NetTopologySuite | 9.0.1 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky,Yoh Deadfall | https://github.com/npgsql/npgsql | | | -| Npgsql.OpenTelemetry | 9.0.2 | Expression | PostgreSQL | https://licenses.nuget.org/PostgreSQL | Copyright 2024 © The Npgsql Development Team | Shay Rojansky | https://github.com/npgsql/npgsql | | | -| Nuke.Common | 9.0.3 | Expression | MIT | https://licenses.nuget.org/MIT | Copyright 2024 Maintainers of NUKE | Matthias Koch and contributors | https://nuke.build/ | | | -| OpenTelemetry | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Exporter.Console | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Exporter.OpenTelemetryProtocol | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Exporter.Prometheus.AspNetCore | 1.11.2-beta.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Extensions.Hosting | 1.11.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Instrumentation.AspNetCore | 1.11.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Instrumentation.EntityFrameworkCore | 1.11.0-beta.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Instrumentation.GrpcNetClient | 1.11.0-beta.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Instrumentation.Http | 1.11.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Instrumentation.Process | 1.11.0-beta.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| OpenTelemetry.Instrumentation.Runtime | 1.11.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright The OpenTelemetry Authors | OpenTelemetry Authors | https://opentelemetry.io/ | | | -| Polly | 8.5.0 | Expression | BSD-3-Clause | https://licenses.nuget.org/BSD-3-Clause | Copyright (c) 2024, App vNext | Michael Wolfenden, App vNext | https://github.com/App-vNext/Polly | | | -| Respawn | 6.2.1 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright Jimmy Bogard | Jimmy Bogard | | | | -| Scalar.AspNetCore | 2.0.18 | Expression | MIT | https://licenses.nuget.org/MIT | | Scalar | https://scalar.com/ | | | -| Scriban | 6.3.0 | Expression | BSD-2-Clause | https://licenses.nuget.org/BSD-2-Clause | Alexandre Mutel | Alexandre Mutel | https://github.com/lunet-io/scriban | | | -| StackExchange.Redis | 2.8.22 | Expression | MIT | https://licenses.nuget.org/MIT | 2014 - 2024 Stack Exchange, Inc. | Stack Exchange, Inc.,Marc Gravell,Nick Craver | https://stackexchange.github.io/StackExchange.Redis/ | | | -| System.CommandLine | 2.0.0-beta4.22272.1 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://github.com/dotnet/command-line-api | | | -| System.Net.Http.Json | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| System.Text.Json | 9.0.0 | Expression | MIT | https://licenses.nuget.org/MIT | © Microsoft Corporation. All rights reserved. | Microsoft | https://dot.net/ | | | -| Tesseract | 5.2.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright 2012-2020 Charles Weld | Charles Weld | https://github.com/charlesw/tesseract/ | | | -| Testcontainers.PostgreSql | 4.0.0 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright (c) 2019 - 2024 Andre Hofmeister and other authors | Andre Hofmeister and contributors | https://dotnet.testcontainers.org/ | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/tests/IntegrationTests/IntegrationTests.csproj | -| Testcontainers.RabbitMq | 4.0.0 | Unknown | | https://aka.ms/deprecateLicenseUrl | Copyright (c) 2019 - 2024 Andre Hofmeister and other authors | Andre Hofmeister and contributors | https://dotnet.testcontainers.org/ | Validation for licenses of type File not yet supported | /Users/Alex/Source/SWeather/SWeather-core/tests/IntegrationTests/IntegrationTests.csproj | -| xunit.runner.visualstudio | 3.0.2 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright (C) .NET Foundation | jnewkirk,bradwilson | | | | -| xunit.v3 | 2.0.0 | Expression | Apache-2.0 | https://licenses.nuget.org/Apache-2.0 | Copyright (C) .NET Foundation | jnewkirk,bradwilson | | | | -+------------------------------------------------------------+-------------------------+----------------------------+--------------------+---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+----------------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ diff --git a/README.md b/README.md index 2c66be2..b0f433d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ DevelopmentCode StyleTesting • -Licence • +LicenseContributing