vlrdevapi 2.1.0__tar.gz → 2.3.0__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 (214) hide show
  1. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.gitattributes +5 -1
  2. vlrdevapi-2.3.0/.github/workflows/cleanup-caches.yml +31 -0
  3. vlrdevapi-2.3.0/.github/workflows/docs-check.yml +102 -0
  4. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.gitignore +2 -0
  5. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/CHANGELOG.md +71 -1
  6. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/PKG-INFO +13 -2
  7. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/README.md +12 -1
  8. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/pyproject.toml +1 -1
  9. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/scripts/check_mdx_examples.py +287 -46
  10. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/scripts/download_fixtures.py +10 -0
  11. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/__init__.py +17 -7
  12. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/__init__.pyi +15 -0
  13. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_client.py +2 -0
  14. vlrdevapi-2.3.0/src/vlrdevapi/_news/__init__.py +5 -0
  15. vlrdevapi-2.3.0/src/vlrdevapi/_news/article/__init__.py +4 -0
  16. vlrdevapi-2.3.0/src/vlrdevapi/_news/article/models.py +41 -0
  17. vlrdevapi-2.3.0/src/vlrdevapi/_news/article/namespace.py +86 -0
  18. vlrdevapi-2.3.0/src/vlrdevapi/_news/article/namespace.pyi +19 -0
  19. vlrdevapi-2.3.0/src/vlrdevapi/_news/article/parser.py +457 -0
  20. vlrdevapi-2.3.0/src/vlrdevapi/_news/common.py +48 -0
  21. vlrdevapi-2.3.0/src/vlrdevapi/_news/list/__init__.py +4 -0
  22. vlrdevapi-2.3.0/src/vlrdevapi/_news/list/models.py +55 -0
  23. vlrdevapi-2.3.0/src/vlrdevapi/_news/list/namespace.py +85 -0
  24. vlrdevapi-2.3.0/src/vlrdevapi/_news/list/namespace.pyi +19 -0
  25. vlrdevapi-2.3.0/src/vlrdevapi/_news/list/parser.py +109 -0
  26. vlrdevapi-2.3.0/src/vlrdevapi/_news/namespace.py +127 -0
  27. vlrdevapi-2.3.0/src/vlrdevapi/_news/namespace.pyi +21 -0
  28. vlrdevapi-2.3.0/src/vlrdevapi/_series/_utils.py +134 -0
  29. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/economy/namespace.py +3 -2
  30. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/economy/parser.py +10 -3
  31. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/match_namespace.py +4 -2
  32. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/performance/models.py +3 -3
  33. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/performance/namespace.py +12 -6
  34. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/performance/parser.py +47 -19
  35. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/players/namespace.py +2 -1
  36. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/players/parser.py +5 -3
  37. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/rounds/namespace.py +3 -2
  38. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/rounds/parser.py +10 -2
  39. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_utils/paths.py +13 -0
  40. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/commons/__init__.py +9 -1
  41. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/commons/datetime.py +32 -0
  42. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/validators.py +1 -1
  43. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/uv.lock +1 -1
  44. vlrdevapi-2.1.0/.github/workflows/docs-check.yml +0 -29
  45. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  46. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  47. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.github/workflows/publish.yml +0 -0
  48. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.github/workflows/test.yml +0 -0
  49. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.python-version +0 -0
  50. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/.readthedocs.yaml +0 -0
  51. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/CODE_OF_CONDUCT.md +0 -0
  52. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/CONTRIBUTING.md +0 -0
  53. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/LICENCE +0 -0
  54. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/SECURITY.md +0 -0
  55. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/SUPPORT.md +0 -0
  56. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_base.py +0 -0
  57. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_cache.py +0 -0
  58. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/__init__.py +0 -0
  59. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/_common.py +0 -0
  60. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/info/__init__.py +0 -0
  61. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/info/models.py +0 -0
  62. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/info/namespace.py +0 -0
  63. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/info/namespace.pyi +0 -0
  64. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/info/parser.py +0 -0
  65. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/list/__init__.py +0 -0
  66. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/list/models.py +0 -0
  67. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/list/namespace.py +0 -0
  68. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/list/namespace.pyi +0 -0
  69. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/list/parser.py +0 -0
  70. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/matches/__init__.py +0 -0
  71. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/matches/models.py +0 -0
  72. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/matches/namespace.py +0 -0
  73. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/matches/namespace.pyi +0 -0
  74. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/matches/parser.py +0 -0
  75. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/namespace.py +0 -0
  76. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/namespace.pyi +0 -0
  77. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/stages/__init__.py +0 -0
  78. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/stages/models.py +0 -0
  79. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/stages/namespace.py +0 -0
  80. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/stages/namespace.pyi +0 -0
  81. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/stages/parser.py +0 -0
  82. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/standings/__init__.py +0 -0
  83. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/standings/models.py +0 -0
  84. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/standings/namespace.py +0 -0
  85. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/standings/namespace.pyi +0 -0
  86. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/standings/parser.py +0 -0
  87. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/teams/__init__.py +0 -0
  88. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/teams/models.py +0 -0
  89. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/teams/namespace.py +0 -0
  90. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/teams/namespace.pyi +0 -0
  91. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_event/teams/parser.py +0 -0
  92. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/__init__.py +0 -0
  93. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/common.py +0 -0
  94. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/completed/__init__.py +0 -0
  95. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/completed/models.py +0 -0
  96. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/completed/namespace.py +0 -0
  97. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/completed/namespace.pyi +0 -0
  98. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/completed/parser.py +0 -0
  99. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/live/__init__.py +0 -0
  100. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/live/models.py +0 -0
  101. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/live/namespace.py +0 -0
  102. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/live/namespace.pyi +0 -0
  103. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/live/parser.py +0 -0
  104. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/namespace.py +0 -0
  105. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/namespace.pyi +0 -0
  106. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/upcoming/__init__.py +0 -0
  107. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/upcoming/models.py +0 -0
  108. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/upcoming/namespace.py +0 -0
  109. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/upcoming/namespace.pyi +0 -0
  110. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_matches/upcoming/parser.py +0 -0
  111. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/__init__.py +0 -0
  112. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/_common_parsing.py +0 -0
  113. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/agents/__init__.py +0 -0
  114. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/agents/models.py +0 -0
  115. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/agents/namespace.py +0 -0
  116. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/agents/namespace.pyi +0 -0
  117. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/agents/parser.py +0 -0
  118. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/info/__init__.py +0 -0
  119. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/info/models.py +0 -0
  120. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/info/namespace.py +0 -0
  121. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/info/namespace.pyi +0 -0
  122. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/info/parser.py +0 -0
  123. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/matches/__init__.py +0 -0
  124. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/matches/models.py +0 -0
  125. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/matches/namespace.py +0 -0
  126. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/matches/namespace.pyi +0 -0
  127. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/matches/parser.py +0 -0
  128. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/namespace.py +0 -0
  129. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/namespace.pyi +0 -0
  130. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/profile/__init__.py +0 -0
  131. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/profile/models.py +0 -0
  132. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/profile/namespace.py +0 -0
  133. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/profile/namespace.pyi +0 -0
  134. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/profile/parser.py +0 -0
  135. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/teams/__init__.py +0 -0
  136. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/teams/models.py +0 -0
  137. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/teams/namespace.py +0 -0
  138. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/teams/namespace.pyi +0 -0
  139. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_player/teams/parser.py +0 -0
  140. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/__init__.py +0 -0
  141. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/economy/__init__.py +0 -0
  142. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/economy/models.py +0 -0
  143. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/economy/namespace.pyi +0 -0
  144. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/info/__init__.py +0 -0
  145. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/info/models.py +0 -0
  146. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/info/namespace.py +0 -0
  147. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/info/namespace.pyi +0 -0
  148. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/info/parser.py +0 -0
  149. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/match_namespace.pyi +0 -0
  150. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/namespace.py +0 -0
  151. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/namespace.pyi +0 -0
  152. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/performance/__init__.py +0 -0
  153. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/performance/namespace.pyi +0 -0
  154. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/players/__init__.py +0 -0
  155. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/players/models.py +0 -0
  156. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/players/namespace.pyi +0 -0
  157. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/rounds/__init__.py +0 -0
  158. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/rounds/models.py +0 -0
  159. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/rounds/namespace.pyi +0 -0
  160. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/vods/__init__.py +0 -0
  161. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/vods/models.py +0 -0
  162. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/vods/namespace.py +0 -0
  163. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/vods/namespace.pyi +0 -0
  164. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_series/vods/parser.py +0 -0
  165. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/__init__.py +0 -0
  166. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/completed_matches/__init__.py +0 -0
  167. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/completed_matches/models.py +0 -0
  168. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/completed_matches/namespace.py +0 -0
  169. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/completed_matches/namespace.pyi +0 -0
  170. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/completed_matches/parser.py +0 -0
  171. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/info/__init__.py +0 -0
  172. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/info/models.py +0 -0
  173. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/info/namespace.py +0 -0
  174. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/info/namespace.pyi +0 -0
  175. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/info/parser.py +0 -0
  176. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/namespace.py +0 -0
  177. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/namespace.pyi +0 -0
  178. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/placements/__init__.py +0 -0
  179. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/placements/models.py +0 -0
  180. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/placements/namespace.py +0 -0
  181. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/placements/namespace.pyi +0 -0
  182. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/placements/parser.py +0 -0
  183. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/roster/__init__.py +0 -0
  184. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/roster/models.py +0 -0
  185. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/roster/namespace.py +0 -0
  186. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/roster/namespace.pyi +0 -0
  187. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/roster/parser.py +0 -0
  188. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/stats/__init__.py +0 -0
  189. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/stats/models.py +0 -0
  190. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/stats/namespace.py +0 -0
  191. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/stats/namespace.pyi +0 -0
  192. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/stats/parser.py +0 -0
  193. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/transactions/__init__.py +0 -0
  194. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/transactions/models.py +0 -0
  195. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/transactions/namespace.py +0 -0
  196. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/transactions/namespace.pyi +0 -0
  197. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/transactions/parser.py +0 -0
  198. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/upcoming_matches/__init__.py +0 -0
  199. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/upcoming_matches/models.py +0 -0
  200. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/upcoming_matches/namespace.py +0 -0
  201. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/upcoming_matches/namespace.pyi +0 -0
  202. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_team/upcoming_matches/parser.py +0 -0
  203. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_utils/__init__.py +0 -0
  204. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_utils/pagination.py +0 -0
  205. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_utils/team_enrichment.py +0 -0
  206. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/_utils/team_parsing.py +0 -0
  207. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/commons/countries.py +0 -0
  208. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/commons/mappings.py +0 -0
  209. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/commons/prizes.py +0 -0
  210. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/commons/timezone.py +0 -0
  211. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/exceptions.py +0 -0
  212. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/fetcher.py +0 -0
  213. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/src/vlrdevapi/py.typed +0 -0
  214. {vlrdevapi-2.1.0 → vlrdevapi-2.3.0}/wrangler.jsonc +0 -0
@@ -4,4 +4,8 @@ docs-py/** linguist-vendored
4
4
 
5
5
  # Exclude test fixtures
6
6
  tests/test_html/** linguist-vendored
7
- tests/test_html/** linguist-detectable=false
7
+ tests/test_html/** linguist-detectable=false
8
+
9
+ # Normalize workflow YAML line endings
10
+ *.yml text eol=lf
11
+ *.yaml text eol=lf
@@ -0,0 +1,31 @@
1
+ name: Cleanup docs-check caches on closed PRs
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - closed
7
+
8
+ permissions:
9
+ actions: write
10
+
11
+ jobs:
12
+ cleanup:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - name: Delete PR caches
16
+ env:
17
+ GH_TOKEN: ${{ github.token }}
18
+ GH_REPO: ${{ github.repository }}
19
+ BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge
20
+ run: |
21
+ echo "Fetching list of cache keys"
22
+ cacheKeysForPR=$(gh cache list --ref $BRANCH --limit 100 --json id --jq '.[].id')
23
+
24
+ ## Setting this to not fail the workflow while deleting cache keys.
25
+ set +e
26
+ echo "Deleting caches..."
27
+ for cacheKey in $cacheKeysForPR
28
+ do
29
+ gh cache delete $cacheKey
30
+ done
31
+ echo "Done"
@@ -0,0 +1,102 @@
1
+ name: Docs Check
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - 'official-docs/**'
7
+ - 'docs-py/**'
8
+ push:
9
+ branches: [main]
10
+ paths:
11
+ - 'official-docs/**'
12
+ - 'docs-py/**'
13
+
14
+ jobs:
15
+ check:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v7
19
+
20
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b
21
+ with:
22
+ python-version: '3.12'
23
+
24
+ - name: Install package
25
+ run: uv sync --group dev
26
+
27
+ # main always validates live against fresh vlr.gg data; never uses the
28
+ # cache. Branch/PR runs reuse fixtures cached by earlier runs in the
29
+ # same PR (within a 2h TTL), falling back to live fetches for anything
30
+ # missing, so the check is correct even with a partially-stale cache.
31
+ - name: Run MDX examples check (main, live)
32
+ if: github.ref_name == 'main'
33
+ run: uv run scripts/check_mdx_examples.py --live
34
+
35
+ # actions/cache v6.1.0, pinned to a reviewed commit SHA.
36
+ - name: Restore fixture cache (branch)
37
+ id: mdx-fixtures
38
+ if: github.ref_name != 'main'
39
+ uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
40
+ with:
41
+ path: fixtures.tar.gz
42
+ key: mdx-fixtures-${{ github.ref_name }}-run-${{ github.run_id }}
43
+ restore-keys: |
44
+ mdx-fixtures-${{ github.ref_name }}-
45
+
46
+ - name: Unpack fixtures (branch)
47
+ if: github.ref_name != 'main'
48
+ run: |
49
+ if [ -f fixtures.tar.gz ]; then
50
+ mkdir -p .cache
51
+ tar -C .cache -xzf fixtures.tar.gz
52
+ fi
53
+
54
+ - name: Check fixture cache age (branch, 2h TTL)
55
+ id: cache-age
56
+ if: github.ref_name != 'main'
57
+ run: |
58
+ matched="${{ steps.mdx-fixtures.outputs.cache-matched-key }}"
59
+ now=$(date +%s)
60
+ if [ -n "$matched" ]; then
61
+ epoch="${matched##*-}"
62
+ age=$(( now - epoch ))
63
+ else
64
+ age=999999
65
+ fi
66
+ if [ "$age" -gt 7200 ]; then
67
+ rm -rf .cache/mdx-html
68
+ rm -f fixtures.tar.gz
69
+ mkdir -p .cache/mdx-html
70
+ echo "fresh=false" >> "$GITHUB_OUTPUT"
71
+ else
72
+ echo "fresh=true" >> "$GITHUB_OUTPUT"
73
+ fi
74
+ echo "now=$now" >> "$GITHUB_OUTPUT"
75
+
76
+ - name: Run MDX examples check (branch)
77
+ if: github.ref_name != 'main'
78
+ run: |
79
+ if [ "${{ steps.cache-age.outputs.fresh }}" == "true" ]; then
80
+ uv run scripts/check_mdx_examples.py --skip-warm
81
+ else
82
+ uv run scripts/check_mdx_examples.py
83
+ fi
84
+
85
+ # always(): a run that fails validation still saved its warm fixtures,
86
+ # so the next fix commit restores and validates fast instead of warming.
87
+ - name: Package fixtures (branch)
88
+ if: always() && github.ref_name != 'main' && steps.cache-age.outputs.fresh == 'false'
89
+ run: |
90
+ mkdir -p .cache/mdx-html
91
+ if [ -n "$(ls -A .cache/mdx-html)" ]; then
92
+ tar -C .cache -czf fixtures.tar.gz mdx-html
93
+ else
94
+ rm -f fixtures.tar.gz
95
+ fi
96
+
97
+ - name: Save fixture cache (branch)
98
+ if: always() && github.ref_name != 'main' && steps.cache-age.outputs.fresh == 'false'
99
+ uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
100
+ with:
101
+ path: fixtures.tar.gz
102
+ key: mdx-fixtures-${{ github.ref_name }}-${{ steps.cache-age.outputs.now }}
@@ -9,6 +9,8 @@ wheels/
9
9
  # Virtual environments
10
10
  .venv
11
11
  tests/test_html/
12
+ .cache/mdx-html/
13
+ fixtures.tar.gz
12
14
 
13
15
  nul
14
16
  .pytest_cache/
@@ -5,7 +5,58 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
- ## [Unreleased]
8
+ ## [2.3.0] - 2026-08-11
9
+
10
+ ### Added
11
+
12
+ - **News namespace** — `vlrdevapi.news(page=1)` lists news items from
13
+ vlr.gg/news, each with `title`, `subtitle`, `link`, `country_name`,
14
+ `date`, and `author`, plus `has_next_page` and `page_number` on the
15
+ returned page.
16
+ - **News article content** — `vlrdevapi.news.article(article_id)` fetches
17
+ a single news article with its `title`, `author`, `date`, associated
18
+ `event_name`/`event_link`, and the full `content` body text. The body
19
+ is also available as Markdown via `content_md`, preserving headings,
20
+ lists, links, emphasis, and clip embeds.
21
+ - **News out-of-range pages** — requesting a news page beyond the last
22
+ available page (e.g. `page=176`) now raises `NotFoundError` instead of
23
+ silently returning an empty result.
24
+
25
+ ### Changed
26
+
27
+ - **News article Markdown links are absolute** — links in `content_md` are
28
+ prefixed with `https://www.vlr.gg` when they were relative (e.g.
29
+ `/player/5132/mada` → `https://www.vlr.gg/player/5132/mada`). Absolute
30
+ and `www.`-prefixed URLs are left untouched. `NewsArticle.event_link` is
31
+ now an absolute URL as well.
32
+
33
+ ### Fixed
34
+
35
+ - **News article clip embeds** — `content_md` clip embeds now link to the
36
+ directly openable watch URL (e.g. `https://clips.twitch.tv/<slug>`) for
37
+ Twitch clips, Twitch VODs, YouTube, and Soop embeds, instead of the embed
38
+ URL which could not be opened in a new tab.
39
+ - **News article Markdown whitespace/emphasis** — inline emphasis and bold
40
+ render correctly around links: source indentation whitespace no longer
41
+ produces double spaces, and `*`/`**` markers no longer wrap whitespace.
42
+ - **News article dates are timezone-aware** — the article date is parsed
43
+ through the shared `commons.parse_vlr_iso_datetime` helper. Offset-aware
44
+ `datetime` attributes are converted to UTC as-is; naive values are
45
+ localised to the client's `source_tz` (or UTC) instead of the local
46
+ machine timezone.
47
+ - **Unknown article IDs raise `NotFoundError`** — vlr.gg returns a generic
48
+ HTTP 200 page for non-existent article IDs; `news.article()` now detects
49
+ the missing article card and raises `NotFoundError` instead of returning
50
+ an empty article.
51
+ - **News article Markdown fidelity** — `content_md` now renders nested
52
+ lists, tables (as pipe tables), and inline `code` verbatim (whitespace
53
+ preserved). Links whose href is `www.`-prefixed are upgraded to
54
+ `https://`, fixing broken relative links in Markdown.
55
+ - **Documentation** — news reference pages updated (article, list, index),
56
+ plus the getting-started guide, main docs index, and README now cover the
57
+ news namespace; model/parser docstrings describe the current behaviour.
58
+
59
+ ## [2.2.0] - 2026-08-11
9
60
 
10
61
  ### Changed
11
62
 
@@ -14,6 +65,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
14
65
  sentinel year of `2019` instead of the current year. Any parsed date with
15
66
  `year < 2020` means the source omitted the year, so guard with
16
67
  `event.start_date.year < 2020` before relying on it.
68
+ - **Series performance field renames (breaking)** — `AdvStatsEntry` fields
69
+ were renamed to descriptive names: `econ` → `economy`, `pl` → `plants`,
70
+ and `de` → `defuses`. Update any code referencing the old field names.
71
+ The series performance reference docs were updated to match.
17
72
 
18
73
  ### Fixed
19
74
 
@@ -22,6 +77,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
22
77
  change behavior in Python 3.15). All such parses now supply an explicit
23
78
  year derived from context (reference date, page-header year, or the
24
79
  sentinel above).
80
+ - **Series per-game stats by game number** — `players()`, `rounds()`,
81
+ `performance()`, and `economy()` game identifiers can now be a 1-based
82
+ game number within the series, resolved to the real VLR game ID from the
83
+ page's game nav tabs. A real VLR game ID is still accepted unchanged;
84
+ previously passing a game number produced empty results.
85
+ - **Series economy and rounds scope** — economy and round-by-round data are
86
+ now parsed from the selected game's section only. The economy parser
87
+ previously collected tables from the whole page, so a per-game request
88
+ could include data from other maps.
89
+ - **Series performance player IDs** — the performance tab renders player
90
+ cells without links, leaving player IDs as `0`. IDs are now recovered from
91
+ the series overview tab (keyed by team abbreviation and player name) and
92
+ attached to kill-matrix entries, advanced stats, and notable-round victims.
25
93
 
26
94
  ## [2.1.0] - 2026-08-07
27
95
 
@@ -125,6 +193,8 @@ The API surface, module structure, and type system are all new.
125
193
  - `aiohttp` and `asyncio` dependencies.
126
194
  - v1.x match/event/team parsing modules.
127
195
 
196
+ [2.3.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.2.0...v2.3.0
197
+ [2.2.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.1.0...v2.2.0
128
198
  [2.1.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.0.1...v2.1.0
129
199
  [2.0.1]: https://github.com/Vanshbordia/vlrdevapi/compare/v2.0.0...v2.0.1
130
200
  [2.0.0]: https://github.com/Vanshbordia/vlrdevapi/compare/v1.6.2...v2.0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vlrdevapi
3
- Version: 2.1.0
3
+ Version: 2.3.0
4
4
  Summary: A Python library to scrape data from vlr.gg
5
5
  Project-URL: Homepage, https://vlrdevapi.pages.dev/
6
6
  Project-URL: Repository, https://github.com/Vanshbordia/vlrdevapi
@@ -68,7 +68,7 @@ Access Valorant esports data from VLR.gg with a clean, type-safe Python API. Get
68
68
 
69
69
  ## Features
70
70
 
71
- - **Complete Data Access** - Events, matches, players, teams, and series
71
+ - **Complete Data Access** - Events, matches, players, teams, series, and news
72
72
  - **Type-Safe** - Pydantic models with rich type hints and field descriptions
73
73
  - **Production-Ready** - Retry logic, rate limiting, and LRU-cached enrichment
74
74
  - **Curried Access** - Bind a player/team/series ID once, then call sub-methods without re-passing
@@ -181,6 +181,17 @@ performance = s.performance() # Advanced performance stats
181
181
  economy = s.economy(game_id=1) # Economy data
182
182
  ```
183
183
 
184
+ ### News
185
+
186
+ ```python
187
+ page = client.news(page=1) # Browse the news listing
188
+ for item in page.news[:5]:
189
+ print(item.title)
190
+
191
+ article = client.news.article(734100) # Fetch a full article
192
+ print(article.content_md) # Article body as Markdown
193
+ ```
194
+
184
195
  ## Documentation
185
196
 
186
197
  - **Official Docs** - [vlrdevapi.pages.dev/docs](https://vlrdevapi.pages.dev/docs)
@@ -20,7 +20,7 @@ Access Valorant esports data from VLR.gg with a clean, type-safe Python API. Get
20
20
 
21
21
  ## Features
22
22
 
23
- - **Complete Data Access** - Events, matches, players, teams, and series
23
+ - **Complete Data Access** - Events, matches, players, teams, series, and news
24
24
  - **Type-Safe** - Pydantic models with rich type hints and field descriptions
25
25
  - **Production-Ready** - Retry logic, rate limiting, and LRU-cached enrichment
26
26
  - **Curried Access** - Bind a player/team/series ID once, then call sub-methods without re-passing
@@ -133,6 +133,17 @@ performance = s.performance() # Advanced performance stats
133
133
  economy = s.economy(game_id=1) # Economy data
134
134
  ```
135
135
 
136
+ ### News
137
+
138
+ ```python
139
+ page = client.news(page=1) # Browse the news listing
140
+ for item in page.news[:5]:
141
+ print(item.title)
142
+
143
+ article = client.news.article(734100) # Fetch a full article
144
+ print(article.content_md) # Article body as Markdown
145
+ ```
146
+
136
147
  ## Documentation
137
148
 
138
149
  - **Official Docs** - [vlrdevapi.pages.dev/docs](https://vlrdevapi.pages.dev/docs)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vlrdevapi"
7
- version = "2.1.0"
7
+ version = "2.3.0"
8
8
  description = "A Python library to scrape data from vlr.gg"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"