artesian-sdk 4.2.3.dev43__tar.gz → 4.3.0a69.post5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. artesian_sdk-4.3.0a69.post5/.github/workflows/publish_nuget_dryrun.yml +435 -0
  2. artesian_sdk-4.3.0a69.post5/.github/workflows/python-tests.yml +315 -0
  3. artesian_sdk-4.3.0a69.post5/CODEOWNERS +5 -0
  4. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/PKG-INFO +127 -27
  5. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/README.md +126 -26
  6. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestActual.py +1 -1
  7. artesian_sdk-4.3.0a69.post5/samples/TestDerivedCfgTransform.py +101 -0
  8. artesian_sdk-4.3.0a69.post5/samples/TestDerivedTransformQueryValidation.py +37 -0
  9. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/MarketDataService.py +49 -0
  10. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/DerivedCfg.py +2 -1
  11. artesian_sdk-4.3.0a69.post5/src/Artesian/MarketData/_Dto/DerivedTransformQueryValidation.py +34 -0
  12. artesian_sdk-4.3.0a69.post5/src/Artesian/MarketData/_Dto/DerivedTransformQueryValidationResponse.py +30 -0
  13. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/MarketDataEntityInput.py +25 -1
  14. artesian_sdk-4.3.0a69.post5/src/Artesian/MarketData/_Dto/TimeSerieData.py +22 -0
  15. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/__init__.py +2 -0
  16. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Enum/DerivedAlgorithm.py +1 -0
  17. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/_ClientsExecutor/Client.py +2 -2
  18. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/_version.py +3 -3
  19. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/artesian_sdk.egg-info/PKG-INFO +127 -27
  20. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/artesian_sdk.egg-info/SOURCES.txt +6 -3
  21. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestMarketDataService.py +109 -0
  22. artesian_sdk-4.2.3.dev43/.github/workflows/dependency-review.yaml +0 -17
  23. artesian_sdk-4.2.3.dev43/.github/workflows/python-tests.yml +0 -102
  24. artesian_sdk-4.2.3.dev43/CODEOWNERS +0 -1
  25. artesian_sdk-4.2.3.dev43/src/artesian_sdk.egg-info/scm_file_list.json +0 -116
  26. artesian_sdk-4.2.3.dev43/src/artesian_sdk.egg-info/scm_version.json +0 -8
  27. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/.flake8 +0 -0
  28. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/.github/dependabot.yml +0 -0
  29. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/.gitignore +0 -0
  30. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/.vscode/extensions.json +0 -0
  31. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/.vscode/launch.json +0 -0
  32. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/.vscode/settings.json +0 -0
  33. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/CONTRIBUTING.md +0 -0
  34. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/LICENSE +0 -0
  35. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/pyproject.toml +0 -0
  36. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/renovate.json +0 -0
  37. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestAuction.py +0 -0
  38. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestBidAsk.py +0 -0
  39. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestDerivedCfg.py +0 -0
  40. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestGMEOffers.py +0 -0
  41. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestMarketDataService.py +0 -0
  42. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestMas.py +0 -0
  43. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestSearchFacet.py +0 -0
  44. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestVersioned.py +0 -0
  45. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndDeleteActual.py +0 -0
  46. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndDeleteAuction.py +0 -0
  47. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndDeleteBidAsk.py +0 -0
  48. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndDeleteMas.py +0 -0
  49. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndDeleteVersioned.py +0 -0
  50. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndQueryActual.py +0 -0
  51. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndQueryAuction.py +0 -0
  52. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndQueryBidAsk.py +0 -0
  53. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/samples/TestWriteDataAndQueryMas.py +0 -0
  54. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/setup.cfg +0 -0
  55. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/.gitignore +0 -0
  56. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/ArtesianConfig.py +0 -0
  57. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/ArtesianPolicyConfig.py +0 -0
  58. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Exceptions.py +0 -0
  59. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/ExtractionRangeConfig.py +0 -0
  60. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/GMEPublicOfferQuery.py +0 -0
  61. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/GMEPublicOfferQueryParameters.py +0 -0
  62. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/GMEPublicOfferService.py +0 -0
  63. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/BaType.py +0 -0
  64. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/GenerationType.py +0 -0
  65. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/Market.py +0 -0
  66. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/Purpose.py +0 -0
  67. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/Scope.py +0 -0
  68. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/Status.py +0 -0
  69. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/UnitType.py +0 -0
  70. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/Zone.py +0 -0
  71. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/_Enum/__init__.py +0 -0
  72. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/GMEPublicOffers/__init__.py +0 -0
  73. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Granularity.py +0 -0
  74. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/CommonUnitOfMeasure.py +0 -0
  75. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/ArtesianMetadataFacet.py +0 -0
  76. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/ArtesianSearchResults.py +0 -0
  77. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/CheckConversionResult.py +0 -0
  78. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/CurveRangeEntity.py +0 -0
  79. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/DeleteData.py +0 -0
  80. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/MarketDataEntityOutput.py +0 -0
  81. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/MarketDataIdentifier.py +0 -0
  82. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/PagedResult.py +0 -0
  83. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/UnitOfMeasure.py +0 -0
  84. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Dto/UpsertData.py +0 -0
  85. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Enum/AggregationRule.py +0 -0
  86. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Enum/ArtesianMetadataFacetType.py +0 -0
  87. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Enum/MarketDataType.py +0 -0
  88. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Enum/UpsertMode.py +0 -0
  89. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/_Enum/__init__.py +0 -0
  90. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/MarketData/__init__.py +0 -0
  91. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/ActualQuery.py +0 -0
  92. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/AuctionQuery.py +0 -0
  93. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/BidAskQuery.py +0 -0
  94. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/DefaultPartitionStrategy.py +0 -0
  95. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/MasQuery.py +0 -0
  96. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/QueryService.py +0 -0
  97. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/RelativeInterval.py +0 -0
  98. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/VersionedQuery.py +0 -0
  99. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_Query.py +0 -0
  100. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/ActualQueryParameters.py +0 -0
  101. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/AuctionQueryParameters.py +0 -0
  102. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/BidAskQueryParameters.py +0 -0
  103. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/ExtractionRangeConfig.py +0 -0
  104. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/ExtractionRangeType.py +0 -0
  105. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/MasQueryParameters.py +0 -0
  106. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/MostRecentSelectionConfig.py +0 -0
  107. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/QueryParameters.py +0 -0
  108. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/VersionSelectionConfig.py +0 -0
  109. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/VersionSelectionType.py +0 -0
  110. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/VersionedQueryParameters.py +0 -0
  111. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/VersionsRangeSelectionConfig.py +0 -0
  112. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/_QueryParameters/__init__.py +0 -0
  113. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/Query/__init__.py +0 -0
  114. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/_ClientsExecutor/ArtesianJsonSerializer.py +0 -0
  115. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/_ClientsExecutor/RequestExecutor.py +0 -0
  116. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/_ClientsExecutor/__init__.py +0 -0
  117. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/Artesian/__init__.py +0 -0
  118. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/artesian_sdk.egg-info/dependency_links.txt +0 -0
  119. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/artesian_sdk.egg-info/requires.txt +0 -0
  120. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/src/artesian_sdk.egg-info/top_level.txt +0 -0
  121. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestActual.py +0 -0
  122. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestBidAsk.py +0 -0
  123. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestClientErrorHandling.py +0 -0
  124. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestGMEPO.py +0 -0
  125. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestMarketDataDeleteData.py +0 -0
  126. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestMarketDataUpsertData.py +0 -0
  127. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestMas.py +0 -0
  128. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/TestVersioned.py +0 -0
  129. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/__init__.py +0 -0
  130. {artesian_sdk-4.2.3.dev43 → artesian_sdk-4.3.0a69.post5}/tests/helpers.py +0 -0
@@ -0,0 +1,435 @@
1
+ # This workflow will install Python dependencies, run tests and lint with a single version of Python
2
+ # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions
3
+
4
+ name: Artesian SDK Python
5
+
6
+ on:
7
+ push:
8
+ branches: [master]
9
+ tags:
10
+ - 'v[0-9]+\.[0-9]+\.[0-9]+'
11
+ - 'v[0-9]+\.[0-9]+\.[0-9]+b[0-9]+'
12
+ - 'v[0-9]+\.[0-9]+\.[0-9]+a[0-9]+\.[0-9]+'
13
+ pull_request:
14
+ branches: [master]
15
+ workflow_dispatch:
16
+
17
+ jobs:
18
+ # ---------------------------------------------------------------------------
19
+ # Pyright
20
+ # ---------------------------------------------------------------------------
21
+
22
+ pyright:
23
+ name: pyright
24
+ runs-on: ubuntu-latest
25
+
26
+ steps:
27
+ - uses: actions/checkout@v7
28
+
29
+ - name: Set up Python 3.11
30
+ uses: actions/setup-python@v7
31
+ with:
32
+ python-version: "3.11"
33
+
34
+ - name: Install dependencies
35
+ shell: bash
36
+ run: |
37
+ python -m pip install --upgrade pip
38
+
39
+ TAG="${GITHUB_REF_NAME}"
40
+
41
+ if [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)a([0-9]+)\.([0-9]+)$ ]]; then
42
+ export SETUPTOOLS_SCM_PRETEND_VERSION="${BASH_REMATCH[1]}a${BASH_REMATCH[2]}.post${BASH_REMATCH[3]}"
43
+ elif [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)b([0-9]+)$ ]]; then
44
+ export SETUPTOOLS_SCM_PRETEND_VERSION="${BASH_REMATCH[1]}b${BASH_REMATCH[2]}"
45
+ fi
46
+
47
+ echo "SETUPTOOLS_SCM_PRETEND_VERSION=${SETUPTOOLS_SCM_PRETEND_VERSION:-not-set}"
48
+
49
+ pip install -e ".[dev]"
50
+
51
+ - name: Run Pyright
52
+ uses: jordemort/action-pyright@v1
53
+ with:
54
+ github_token: ${{ secrets.GITHUB_TOKEN }}
55
+ reporter: github-check
56
+ lib:
57
+ level: warning
58
+ filter_mode: file
59
+
60
+ # ---------------------------------------------------------------------------
61
+ # Build / Test
62
+ # ---------------------------------------------------------------------------
63
+
64
+ build:
65
+ name: Build
66
+ runs-on: ${{ matrix.os }}
67
+
68
+ strategy:
69
+ matrix:
70
+ python-version: ["3.8", "3.9", "3.10", "3.11"]
71
+ os: ["ubuntu-latest", "windows-latest", "macos-latest"]
72
+
73
+ steps:
74
+ - uses: actions/checkout@v7
75
+
76
+ - name: Set up Python ${{ matrix.python-version }}
77
+ uses: actions/setup-python@v7
78
+ with:
79
+ python-version: ${{ matrix.python-version }}
80
+
81
+ - name: Install dependencies
82
+ shell: bash
83
+ run: |
84
+ python -m pip install --upgrade pip
85
+
86
+ TAG="${GITHUB_REF_NAME}"
87
+
88
+ if [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)a([0-9]+)\.([0-9]+)$ ]]; then
89
+ export SETUPTOOLS_SCM_PRETEND_VERSION="${BASH_REMATCH[1]}a${BASH_REMATCH[2]}.post${BASH_REMATCH[3]}"
90
+ elif [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)b([0-9]+)$ ]]; then
91
+ export SETUPTOOLS_SCM_PRETEND_VERSION="${BASH_REMATCH[1]}b${BASH_REMATCH[2]}"
92
+ fi
93
+
94
+ echo "SETUPTOOLS_SCM_PRETEND_VERSION=${SETUPTOOLS_SCM_PRETEND_VERSION:-not-set}"
95
+
96
+ pip install -e ".[dev]"
97
+
98
+ - name: Run flake8
99
+ run: |
100
+ flake8 .
101
+
102
+ - name: Test Pytest
103
+ run: |
104
+ pytest --junitxml=junit/test-results-${{ matrix.python-version }}-${{ matrix.os }}.xml
105
+
106
+ - name: Upload pytest test results
107
+ uses: actions/upload-artifact@v7
108
+ with:
109
+ name: pytest-results-${{ matrix.python-version }}-${{ matrix.os }}
110
+ path: junit/test-results-${{ matrix.python-version }}-${{ matrix.os }}.xml
111
+ if: ${{ always() }}
112
+
113
+ # ---------------------------------------------------------------------------
114
+ # Publish Stable
115
+ #
116
+ # Tag:
117
+ # v2.4.0
118
+ #
119
+ # Python version:
120
+ # 2.4.0
121
+ #
122
+ # Must originate from:
123
+ # master
124
+ # ---------------------------------------------------------------------------
125
+
126
+ publish-stable:
127
+ name: "Publish Stable"
128
+ runs-on: ubuntu-latest
129
+
130
+ if: >
131
+ github.event_name == 'push' &&
132
+ startsWith(github.ref, 'refs/tags/v') &&
133
+ !contains(github.ref_name, 'a') &&
134
+ !contains(github.ref_name, 'b')
135
+
136
+ steps:
137
+ - name: "Validate GA release tag"
138
+ shell: bash
139
+ run: |
140
+ TAG="${GITHUB_REF_NAME}"
141
+
142
+ if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
143
+ echo "::error::Invalid GA release tag: $TAG"
144
+ echo "Expected format: vX.Y.Z"
145
+ exit 1
146
+ fi
147
+
148
+ echo "Valid GA release tag: $TAG"
149
+
150
+ - name: "Checkout"
151
+ uses: actions/checkout@v7
152
+ with:
153
+ fetch-depth: 0
154
+
155
+ - name: "Validate tag originates from master"
156
+ shell: bash
157
+ run: |
158
+ git fetch origin master
159
+
160
+ if ! git merge-base --is-ancestor "$GITHUB_SHA" "origin/master"; then
161
+ echo "::error::Release tag $GITHUB_REF_NAME does not point to a commit contained in master."
162
+ exit 1
163
+ fi
164
+
165
+ echo "Release commit is contained in master."
166
+
167
+ - name: "Set up Python 3.11"
168
+ uses: actions/setup-python@v7
169
+ with:
170
+ python-version: "3.11"
171
+
172
+ - name: "Install dependencies"
173
+ run: |
174
+ python -m pip install --upgrade pip
175
+ python -m pip install build
176
+
177
+ - name: "Build package"
178
+ run: |
179
+ python -m build
180
+
181
+ - name: "Publish package"
182
+ uses: pypa/gh-action-pypi-publish@release/v1
183
+ with:
184
+ user: __token__
185
+ password: ${{ secrets.PYPI_API_TOKEN }}
186
+
187
+ # ---------------------------------------------------------------------------
188
+ # Publish Beta
189
+ #
190
+ # Tag:
191
+ # v2.5.0b1
192
+ # v2.5.0b2
193
+ # v2.5.0b3
194
+ #
195
+ # Python version:
196
+ # 2.5.0b1
197
+ # 2.5.0b2
198
+ # 2.5.0b3
199
+ #
200
+ # Must originate from:
201
+ # develop-beta
202
+ #
203
+ # Beta version must target the next minor version after master.
204
+ # Example:
205
+ #
206
+ # master = 2.4.0
207
+ # develop-beta = 2.5.0b1
208
+ #
209
+ # ---------------------------------------------------------------------------
210
+
211
+ publish-beta:
212
+ name: "Publish Beta"
213
+ runs-on: ubuntu-latest
214
+
215
+ if: >
216
+ github.event_name == 'push' &&
217
+ startsWith(github.ref, 'refs/tags/v') &&
218
+ contains(github.ref_name, 'b')
219
+
220
+ steps:
221
+ - name: "Validate Beta release tag"
222
+ shell: bash
223
+ run: |
224
+ TAG="${GITHUB_REF_NAME}"
225
+
226
+ if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+b[0-9]+$ ]]; then
227
+ echo "::error::Invalid Beta release tag: $TAG"
228
+ echo "Expected format: vX.Y.ZbN"
229
+ exit 1
230
+ fi
231
+
232
+ echo "Valid Beta release tag: $TAG"
233
+
234
+ - name: "Checkout"
235
+ uses: actions/checkout@v7
236
+ with:
237
+ fetch-depth: 0
238
+
239
+ - name: "Validate tag originates from develop-beta"
240
+ shell: bash
241
+ run: |
242
+ git fetch origin develop-beta
243
+
244
+ if ! git merge-base --is-ancestor "$GITHUB_SHA" "origin/develop-beta"; then
245
+ echo "::error::Beta release tag does not point to a commit contained in develop-beta."
246
+ exit 1
247
+ fi
248
+
249
+ echo "Release commit is contained in develop-beta."
250
+
251
+ - name: "Validate next version"
252
+ shell: bash
253
+ run: |
254
+ TAG="${GITHUB_REF_NAME}"
255
+
256
+ git fetch origin master --tags
257
+
258
+ MASTER_VERSION=$(git describe --tags --abbrev=0 origin/master | sed 's/^v//')
259
+ BETA_VERSION=$(echo "$TAG" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+)b[0-9]+$/\1/')
260
+
261
+ MASTER_MAJOR=$(echo "$MASTER_VERSION" | cut -d. -f1)
262
+ MASTER_MINOR=$(echo "$MASTER_VERSION" | cut -d. -f2)
263
+
264
+ BETA_MAJOR=$(echo "$BETA_VERSION" | cut -d. -f1)
265
+ BETA_MINOR=$(echo "$BETA_VERSION" | cut -d. -f2)
266
+
267
+ if [[ "$BETA_MAJOR.$BETA_MINOR" != "$MASTER_MAJOR.$((MASTER_MINOR + 1))" ]]; then
268
+ echo "::error::Beta version $BETA_VERSION is not the next minor version after master $MASTER_VERSION."
269
+ exit 1
270
+ fi
271
+
272
+ echo "Beta version $BETA_VERSION is the next version after master $MASTER_VERSION."
273
+
274
+ - name: "Set up Python 3.11"
275
+ uses: actions/setup-python@v7
276
+ with:
277
+ python-version: "3.11"
278
+
279
+ - name: "Install dependencies"
280
+ run: |
281
+ python -m pip install --upgrade pip
282
+ python -m pip install build
283
+
284
+ - name: "Build package"
285
+ run: |
286
+ python -m build
287
+
288
+ - name: "Publish package"
289
+ uses: pypa/gh-action-pypi-publish@release/v1
290
+ with:
291
+ user: __token__
292
+ password: ${{ secrets.PYPI_API_TOKEN }}
293
+
294
+ # ---------------------------------------------------------------------------
295
+ # Publish PR Preview
296
+ #
297
+ # Tag:
298
+ # v2.4.0a123.1
299
+ # v2.4.0a123.2
300
+ #
301
+ # Python version:
302
+ # 2.4.0a123.1
303
+ # 2.4.0a123.2
304
+ #
305
+ # Where:
306
+ # 2.4.0 = current master version
307
+ # 123 = PR number
308
+ # 1 / 2 = preview iteration
309
+ #
310
+ # Must be based on the current master.
311
+ # ---------------------------------------------------------------------------
312
+
313
+ publish-preview:
314
+ name: "Publish PR Preview"
315
+ runs-on: ubuntu-latest
316
+
317
+ if: >
318
+ github.event_name == 'push' &&
319
+ startsWith(github.ref, 'refs/tags/v') &&
320
+ contains(github.ref_name, 'a')
321
+
322
+ steps:
323
+ - name: "Validate PR Preview tag"
324
+ shell: bash
325
+ run: |
326
+ TAG="${GITHUB_REF_NAME}"
327
+
328
+ if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+a[0-9]+\.[0-9]+$ ]]; then
329
+ echo "::error::Invalid PR Preview tag: $TAG"
330
+ echo "Expected format: vX.Y.ZaPR_NUMBER.ITERATION"
331
+ exit 1
332
+ fi
333
+
334
+ echo "Valid PR Preview tag: $TAG"
335
+
336
+ - name: "Extract PR number"
337
+ id: pr
338
+ shell: bash
339
+ run: |
340
+ TAG="${GITHUB_REF_NAME}"
341
+
342
+ PR_NUMBER=$(echo "$TAG" | sed -E 's/^v[0-9]+\.[0-9]+\.[0-9]+a([0-9]+)\.[0-9]+$/\1/')
343
+ ITERATION=$(echo "$TAG" | sed -E 's/^v[0-9]+\.[0-9]+\.[0-9]+a[0-9]+\.([0-9]+)$/\1/')
344
+
345
+ echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
346
+ echo "iteration=$ITERATION" >> "$GITHUB_OUTPUT"
347
+
348
+ echo "PR number: $PR_NUMBER"
349
+ echo "Iteration: $ITERATION"
350
+
351
+ - name: "Checkout merged PR head"
352
+ uses: actions/checkout@v7
353
+ with:
354
+ ref: refs/pull/${{ steps.pr.outputs.number }}/merge
355
+ fetch-depth: 0
356
+
357
+ - name: "Validate PR is based on current master"
358
+ shell: bash
359
+ run: |
360
+ git fetch origin master
361
+
362
+ CURRENT_MASTER=$(git rev-parse origin/master)
363
+ MERGE_PARENT=$(git rev-parse HEAD^1)
364
+
365
+ echo "Current master: $CURRENT_MASTER"
366
+ echo "Merge parent: $MERGE_PARENT"
367
+
368
+ if [[ "$MERGE_PARENT" != "$CURRENT_MASTER" ]]; then
369
+ echo "::error::PR Preview is not based on the current master."
370
+ exit 1
371
+ fi
372
+
373
+ echo "PR Preview is based on master."
374
+
375
+ - name: "Validate preview version"
376
+ shell: bash
377
+ run: |
378
+ TAG="${GITHUB_REF_NAME}"
379
+
380
+ git fetch origin master --tags
381
+
382
+ MASTER_VERSION=$(
383
+ git tag --merged origin/master --sort=-version:refname |
384
+ grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' |
385
+ head -n 1 |
386
+ sed 's/^v//'
387
+ )
388
+
389
+ PREVIEW_VERSION=$(echo "$TAG" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+)a[0-9]+\.[0-9]+$/\1/')
390
+
391
+ echo "Master GA version: $MASTER_VERSION"
392
+ echo "Preview version: $PREVIEW_VERSION"
393
+
394
+ if [[ -z "$MASTER_VERSION" ]]; then
395
+ echo "::error::Could not determine the latest GA version on master."
396
+ exit 1
397
+ fi
398
+
399
+ if [[ "$PREVIEW_VERSION" != "$MASTER_VERSION" ]]; then
400
+ echo "::error::PR Preview version $PREVIEW_VERSION does not match current master GA version $MASTER_VERSION."
401
+ exit 1
402
+ fi
403
+
404
+ echo "PR Preview version matches current master GA version: $MASTER_VERSION"
405
+
406
+ - name: "Set up Python 3.11"
407
+ uses: actions/setup-python@v7
408
+ with:
409
+ python-version: "3.11"
410
+
411
+ - name: "Install dependencies"
412
+ shell: bash
413
+ run: |
414
+ python -m pip install --upgrade pip
415
+ python -m pip install build
416
+
417
+ - name: "Build package"
418
+ shell: bash
419
+ run: |
420
+ TAG="${GITHUB_REF_NAME}"
421
+
422
+ if [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)a([0-9]+)\.([0-9]+)$ ]]; then
423
+ export SETUPTOOLS_SCM_PRETEND_VERSION="${BASH_REMATCH[1]}a${BASH_REMATCH[2]}.post${BASH_REMATCH[3]}"
424
+ fi
425
+
426
+ echo "SETUPTOOLS_SCM_PRETEND_VERSION=${SETUPTOOLS_SCM_PRETEND_VERSION}"
427
+
428
+ python -m build
429
+
430
+ - name: "Publish package"
431
+ uses: pypa/gh-action-pypi-publish@release/v1
432
+ with:
433
+ user: __token__
434
+ password: ${{ secrets.PYPI_API_TOKEN }}
435
+