datapungi_fed 0.5.0__py3-none-any.whl

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 (201) hide show
  1. datapungi_fed/__init__.py +71 -0
  2. datapungi_fed/api.py +98 -0
  3. datapungi_fed/codegen.py +109 -0
  4. datapungi_fed/config/__init__.py +0 -0
  5. datapungi_fed/config/datasetlist.yaml +499 -0
  6. datapungi_fed/config/pkgConfig.yaml +1 -0
  7. datapungi_fed/config/userSettings.json +1 -0
  8. datapungi_fed/connection.py +56 -0
  9. datapungi_fed/core.py +222 -0
  10. datapungi_fed/drivers.py +37 -0
  11. datapungi_fed/groups.py +99 -0
  12. datapungi_fed/tests/__init__.py +3 -0
  13. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-None-args0-kwargs0].yaml +50 -0
  14. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-category-args1-kwargs1].yaml +50 -0
  15. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-children-args2-kwargs2].yaml +54 -0
  16. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-related-args3-kwargs3].yaml +50 -0
  17. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-related_tags-args6-kwargs6].yaml +59 -0
  18. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-series-args4-kwargs4].yaml +304 -0
  19. datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-tags-args5-kwargs5].yaml +74 -0
  20. datapungi_fed/tests/cassettes/test_drivers/test_code_string[geo-None-args32-kwargs32].yaml +59 -0
  21. datapungi_fed/tests/cassettes/test_drivers/test_code_string[geo-meta-args34-kwargs34].yaml +50 -0
  22. datapungi_fed/tests/cassettes/test_drivers/test_code_string[geo-shapes-args33-kwargs33].yaml +56 -0
  23. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-None-args7-kwargs7].yaml +1584 -0
  24. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-dates-args10-kwargs10].yaml +50 -0
  25. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-related_tags-args14-kwargs14].yaml +59 -0
  26. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-release-args9-kwargs9].yaml +51 -0
  27. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-releases-args8-kwargs8].yaml +1584 -0
  28. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-series-args11-kwargs11].yaml +5225 -0
  29. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-sources-args12-kwargs12].yaml +51 -0
  30. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-tables-args15-kwargs15].yaml +58 -0
  31. datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-tags-args13-kwargs13].yaml +480 -0
  32. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-categories-args17-kwargs17].yaml +50 -0
  33. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-release-args18-kwargs18].yaml +53 -0
  34. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-search-args19-kwargs19].yaml +8535 -0
  35. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-search-related_tags-args21-kwargs21].yaml +67 -0
  36. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-search-tags-args20-kwargs20].yaml +443 -0
  37. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-series-args16-kwargs16].yaml +58 -0
  38. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-tags-args22-kwargs22].yaml +61 -0
  39. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-updates-args23-kwargs23].yaml +5078 -0
  40. datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-vintagedates-args24-kwargs24].yaml +50 -0
  41. datapungi_fed/tests/cassettes/test_drivers/test_code_string[sources-releases-args31-kwargs31].yaml +222 -0
  42. datapungi_fed/tests/cassettes/test_drivers/test_code_string[sources-source-args30-kwargs30].yaml +51 -0
  43. datapungi_fed/tests/cassettes/test_drivers/test_code_string[sources-sources-args29-kwargs29].yaml +205 -0
  44. datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-None-args25-kwargs25].yaml +63 -0
  45. datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-related_tags-args27-kwargs27].yaml +63 -0
  46. datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-series-args28-kwargs28].yaml +194 -0
  47. datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-tags-args26-kwargs26].yaml +52 -0
  48. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-None-args0-kwargs0].yaml +50 -0
  49. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-category-args1-kwargs1].yaml +50 -0
  50. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-children-args2-kwargs2].yaml +54 -0
  51. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-related-args3-kwargs3].yaml +50 -0
  52. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-related_tags-args6-kwargs6].yaml +59 -0
  53. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-series-args4-kwargs4].yaml +304 -0
  54. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-tags-args5-kwargs5].yaml +74 -0
  55. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[geo-None-args32-kwargs32].yaml +59 -0
  56. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[geo-meta-args34-kwargs34].yaml +50 -0
  57. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[geo-shapes-args33-kwargs33].yaml +56 -0
  58. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-None-args7-kwargs7].yaml +1584 -0
  59. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-dates-args10-kwargs10].yaml +50 -0
  60. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-related_tags-args14-kwargs14].yaml +59 -0
  61. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-release-args9-kwargs9].yaml +51 -0
  62. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-releases-args8-kwargs8].yaml +1584 -0
  63. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-series-args11-kwargs11].yaml +5225 -0
  64. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-sources-args12-kwargs12].yaml +51 -0
  65. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-tables-args15-kwargs15].yaml +58 -0
  66. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-tags-args13-kwargs13].yaml +480 -0
  67. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-categories-args17-kwargs17].yaml +50 -0
  68. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-release-args18-kwargs18].yaml +53 -0
  69. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-search-args19-kwargs19].yaml +8535 -0
  70. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-search-related_tags-args21-kwargs21].yaml +67 -0
  71. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-search-tags-args20-kwargs20].yaml +443 -0
  72. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-series-args16-kwargs16].yaml +58 -0
  73. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-tags-args22-kwargs22].yaml +61 -0
  74. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-updates-args23-kwargs23].yaml +5078 -0
  75. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-vintagedates-args24-kwargs24].yaml +50 -0
  76. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[sources-releases-args31-kwargs31].yaml +222 -0
  77. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[sources-source-args30-kwargs30].yaml +51 -0
  78. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[sources-sources-args29-kwargs29].yaml +205 -0
  79. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-None-args25-kwargs25].yaml +63 -0
  80. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-related_tags-args27-kwargs27].yaml +63 -0
  81. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-series-args28-kwargs28].yaml +194 -0
  82. datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-tags-args26-kwargs26].yaml +52 -0
  83. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-None-args0-kwargs0].yaml +50 -0
  84. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-category-args1-kwargs1].yaml +50 -0
  85. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-children-args2-kwargs2].yaml +54 -0
  86. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-related-args3-kwargs3].yaml +50 -0
  87. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-related_tags-args6-kwargs6].yaml +59 -0
  88. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-series-args4-kwargs4].yaml +304 -0
  89. datapungi_fed/tests/cassettes/test_drivers/test_status[categories-tags-args5-kwargs5].yaml +74 -0
  90. datapungi_fed/tests/cassettes/test_drivers/test_status[geo-None-args32-kwargs32].yaml +59 -0
  91. datapungi_fed/tests/cassettes/test_drivers/test_status[geo-meta-args34-kwargs34].yaml +50 -0
  92. datapungi_fed/tests/cassettes/test_drivers/test_status[geo-shapes-args33-kwargs33].yaml +56 -0
  93. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-None-args7-kwargs7].yaml +1584 -0
  94. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-dates-args10-kwargs10].yaml +50 -0
  95. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-related_tags-args14-kwargs14].yaml +59 -0
  96. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-release-args9-kwargs9].yaml +51 -0
  97. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-releases-args8-kwargs8].yaml +1584 -0
  98. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-series-args11-kwargs11].yaml +5225 -0
  99. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-sources-args12-kwargs12].yaml +51 -0
  100. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-tables-args15-kwargs15].yaml +58 -0
  101. datapungi_fed/tests/cassettes/test_drivers/test_status[releases-tags-args13-kwargs13].yaml +480 -0
  102. datapungi_fed/tests/cassettes/test_drivers/test_status[series-categories-args17-kwargs17].yaml +50 -0
  103. datapungi_fed/tests/cassettes/test_drivers/test_status[series-release-args18-kwargs18].yaml +53 -0
  104. datapungi_fed/tests/cassettes/test_drivers/test_status[series-search-args19-kwargs19].yaml +8535 -0
  105. datapungi_fed/tests/cassettes/test_drivers/test_status[series-search-related_tags-args21-kwargs21].yaml +67 -0
  106. datapungi_fed/tests/cassettes/test_drivers/test_status[series-search-tags-args20-kwargs20].yaml +443 -0
  107. datapungi_fed/tests/cassettes/test_drivers/test_status[series-series-args16-kwargs16].yaml +58 -0
  108. datapungi_fed/tests/cassettes/test_drivers/test_status[series-tags-args22-kwargs22].yaml +61 -0
  109. datapungi_fed/tests/cassettes/test_drivers/test_status[series-updates-args23-kwargs23].yaml +5078 -0
  110. datapungi_fed/tests/cassettes/test_drivers/test_status[series-vintagedates-args24-kwargs24].yaml +50 -0
  111. datapungi_fed/tests/cassettes/test_drivers/test_status[sources-releases-args31-kwargs31].yaml +222 -0
  112. datapungi_fed/tests/cassettes/test_drivers/test_status[sources-source-args30-kwargs30].yaml +51 -0
  113. datapungi_fed/tests/cassettes/test_drivers/test_status[sources-sources-args29-kwargs29].yaml +205 -0
  114. datapungi_fed/tests/cassettes/test_drivers/test_status[tags-None-args25-kwargs25].yaml +63 -0
  115. datapungi_fed/tests/cassettes/test_drivers/test_status[tags-related_tags-args27-kwargs27].yaml +63 -0
  116. datapungi_fed/tests/cassettes/test_drivers/test_status[tags-series-args28-kwargs28].yaml +194 -0
  117. datapungi_fed/tests/cassettes/test_drivers/test_status[tags-tags-args26-kwargs26].yaml +52 -0
  118. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-None-args0-kwargs0].yaml +50 -0
  119. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-category-args1-kwargs1].yaml +50 -0
  120. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-children-args2-kwargs2].yaml +54 -0
  121. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-related-args3-kwargs3].yaml +50 -0
  122. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-related_tags-args6-kwargs6].yaml +59 -0
  123. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-series-args4-kwargs4].yaml +304 -0
  124. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-tags-args5-kwargs5].yaml +74 -0
  125. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[geo-None-args32-kwargs32].yaml +59 -0
  126. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[geo-meta-args34-kwargs34].yaml +50 -0
  127. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[geo-shapes-args33-kwargs33].yaml +56 -0
  128. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-None-args7-kwargs7].yaml +1584 -0
  129. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-dates-args10-kwargs10].yaml +50 -0
  130. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-related_tags-args14-kwargs14].yaml +59 -0
  131. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-release-args9-kwargs9].yaml +51 -0
  132. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-releases-args8-kwargs8].yaml +1584 -0
  133. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-series-args11-kwargs11].yaml +5225 -0
  134. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-sources-args12-kwargs12].yaml +51 -0
  135. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-tables-args15-kwargs15].yaml +58 -0
  136. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-tags-args13-kwargs13].yaml +480 -0
  137. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-categories-args17-kwargs17].yaml +50 -0
  138. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-release-args18-kwargs18].yaml +53 -0
  139. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-search-args19-kwargs19].yaml +8535 -0
  140. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-search-related_tags-args21-kwargs21].yaml +67 -0
  141. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-search-tags-args20-kwargs20].yaml +443 -0
  142. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-series-args16-kwargs16].yaml +58 -0
  143. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-tags-args22-kwargs22].yaml +61 -0
  144. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-updates-args23-kwargs23].yaml +5078 -0
  145. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-vintagedates-args24-kwargs24].yaml +50 -0
  146. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[sources-releases-args31-kwargs31].yaml +222 -0
  147. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[sources-source-args30-kwargs30].yaml +51 -0
  148. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[sources-sources-args29-kwargs29].yaml +205 -0
  149. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-None-args25-kwargs25].yaml +63 -0
  150. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-related_tags-args27-kwargs27].yaml +63 -0
  151. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-series-args28-kwargs28].yaml +194 -0
  152. datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-tags-args26-kwargs26].yaml +52 -0
  153. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-None-args0-kwargs0].yaml +50 -0
  154. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-category-args1-kwargs1].yaml +50 -0
  155. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-children-args2-kwargs2].yaml +54 -0
  156. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-related-args3-kwargs3].yaml +50 -0
  157. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-related_tags-args6-kwargs6].yaml +59 -0
  158. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-series-args4-kwargs4].yaml +304 -0
  159. datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-tags-args5-kwargs5].yaml +74 -0
  160. datapungi_fed/tests/cassettes/test_driversCI/test_status[geo-None-args32-kwargs32].yaml +59 -0
  161. datapungi_fed/tests/cassettes/test_driversCI/test_status[geo-meta-args34-kwargs34].yaml +50 -0
  162. datapungi_fed/tests/cassettes/test_driversCI/test_status[geo-shapes-args33-kwargs33].yaml +56 -0
  163. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-None-args7-kwargs7].yaml +1584 -0
  164. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-dates-args10-kwargs10].yaml +50 -0
  165. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-related_tags-args14-kwargs14].yaml +59 -0
  166. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-release-args9-kwargs9].yaml +51 -0
  167. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-releases-args8-kwargs8].yaml +1584 -0
  168. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-series-args11-kwargs11].yaml +5225 -0
  169. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-sources-args12-kwargs12].yaml +51 -0
  170. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-tables-args15-kwargs15].yaml +58 -0
  171. datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-tags-args13-kwargs13].yaml +480 -0
  172. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-categories-args17-kwargs17].yaml +50 -0
  173. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-release-args18-kwargs18].yaml +53 -0
  174. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-search-args19-kwargs19].yaml +8535 -0
  175. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-search-related_tags-args21-kwargs21].yaml +67 -0
  176. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-search-tags-args20-kwargs20].yaml +443 -0
  177. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-series-args16-kwargs16].yaml +58 -0
  178. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-tags-args22-kwargs22].yaml +61 -0
  179. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-updates-args23-kwargs23].yaml +5078 -0
  180. datapungi_fed/tests/cassettes/test_driversCI/test_status[series-vintagedates-args24-kwargs24].yaml +50 -0
  181. datapungi_fed/tests/cassettes/test_driversCI/test_status[sources-releases-args31-kwargs31].yaml +222 -0
  182. datapungi_fed/tests/cassettes/test_driversCI/test_status[sources-source-args30-kwargs30].yaml +51 -0
  183. datapungi_fed/tests/cassettes/test_driversCI/test_status[sources-sources-args29-kwargs29].yaml +205 -0
  184. datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-None-args25-kwargs25].yaml +63 -0
  185. datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-related_tags-args27-kwargs27].yaml +63 -0
  186. datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-series-args28-kwargs28].yaml +194 -0
  187. datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-tags-args26-kwargs26].yaml +52 -0
  188. datapungi_fed/tests/cassettes/test_driversCI/test_ts_multiple_series.yaml +98 -0
  189. datapungi_fed/tests/conftest.py +48 -0
  190. datapungi_fed/tests/main.py +57 -0
  191. datapungi_fed/tests/testResults/datapungi_fed_Tests.html +1094 -0
  192. datapungi_fed/tests/test_config.py +34 -0
  193. datapungi_fed/tests/test_drivers.py +103 -0
  194. datapungi_fed/tests/test_driversCI.py +106 -0
  195. datapungi_fed/tests/test_transform.py +157 -0
  196. datapungi_fed/transform.py +202 -0
  197. datapungi_fed/utils.py +248 -0
  198. datapungi_fed-0.5.0.dist-info/METADATA +275 -0
  199. datapungi_fed-0.5.0.dist-info/RECORD +201 -0
  200. datapungi_fed-0.5.0.dist-info/WHEEL +4 -0
  201. datapungi_fed-0.5.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,71 @@
1
+ """Gets FRED and GeoFRED data from Federal Reserve (FED) by connecting to its API."""
2
+ from typing import Any
3
+
4
+ import pandas as pd
5
+
6
+ import datapungi_fed.tests as tests
7
+ from datapungi_fed.api import Client
8
+
9
+ __version__ = '0.5.0'
10
+
11
+ _default_client: Client | None = None
12
+
13
+ _GROUP_NAMES = {
14
+ 'datasetlist', 'category', 'release', 'series', 'source', 'tag', 'geo'
15
+ }
16
+
17
+ __all__ = ['Client', 'ts', 'tests', *_GROUP_NAMES]
18
+
19
+
20
+ def __dir__() -> list[str]:
21
+ """Expose only the public, user-facing names for tab completion and help()."""
22
+ return sorted(set(__all__) | {'__version__'})
23
+
24
+
25
+ def _get_data() -> Client:
26
+ """Return the lazily-initialized default module-level client."""
27
+ global _default_client
28
+ if _default_client is None:
29
+ _default_client = Client()
30
+ return _default_client
31
+
32
+
33
+ def __getattr__(name: str) -> Any:
34
+ """Expose database group attributes at module level (e.g. ``dpf.series``)."""
35
+ if name in _GROUP_NAMES:
36
+ return getattr(_get_data(), name)
37
+ raise AttributeError(f"module 'datapungi_fed' has no attribute '{name}'")
38
+
39
+
40
+ def ts(*args: Any, **kwargs: Any) -> Any:
41
+ """Quick time-series query — shortcut for ``dpf.series(...)``.
42
+
43
+ A list or tuple of series IDs can be passed to fetch multiple series and
44
+ merge them into a single ``DataFrame`` with one column per series.
45
+ """
46
+ # Support dpf.ts(['gdp', 'gnp']) by fetching each series individually and
47
+ # concatenating along columns.
48
+ if (
49
+ len(args) == 1
50
+ and isinstance(args[0], (list, tuple))
51
+ and all(isinstance(t, str) for t in args[0])
52
+ ):
53
+ tickers = list(args[0])
54
+ if not tickers:
55
+ return pd.DataFrame()
56
+
57
+ # verbose mode is per-series and not meaningful for a merged frame.
58
+ kwargs.pop('verbose', None)
59
+
60
+ frames: list[pd.DataFrame] = []
61
+ meta: dict[str, Any] = {}
62
+ for ticker in tickers:
63
+ df = getattr(_get_data(), 'series')(ticker, **kwargs)
64
+ frames.append(df)
65
+ meta[ticker] = df.attrs.get('meta', {})
66
+
67
+ combined = pd.concat(frames, axis=1, sort=True)
68
+ combined.attrs['meta'] = meta
69
+ return combined
70
+
71
+ return getattr(_get_data(), 'series')(*args, **kwargs)
datapungi_fed/api.py ADDED
@@ -0,0 +1,98 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ import pandas as pd
5
+
6
+ from datapungi_fed import connection as settings
7
+ from datapungi_fed import drivers
8
+ from datapungi_fed.core import _load_datasetlist, _make_group_functions, _QueryExecutor
9
+ from datapungi_fed.groups import DriverGroup
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ # Singular user-facing attribute names for each database group.
14
+ _GROUP_ALIASES = {
15
+ 'Categories': 'category',
16
+ 'Releases': 'release',
17
+ 'Series': 'series',
18
+ 'Sources': 'source',
19
+ 'Tags': 'tag',
20
+ 'Geo': 'geo',
21
+ }
22
+
23
+
24
+ class Client:
25
+ """
26
+ Explicit client for the FRED and GeoFRED APIs.
27
+
28
+ Parameters
29
+ ----------
30
+ api_key : str, dict, or None
31
+ FRED API key as a string, or a connection configuration dictionary,
32
+ or ``None`` to load the key from the ``API_KEY_FED`` environment
33
+ variable / package settings.
34
+ userSettings : dict, optional
35
+ Optional user settings dictionary.
36
+ """
37
+ def __init__(
38
+ self,
39
+ api_key: str | dict[str, Any] | None = None,
40
+ userSettings: dict[str, Any] | None = None,
41
+ ):
42
+ self.__connectInfo = settings._get_connection_config(
43
+ connectionParameters=api_key, userSettings=userSettings
44
+ )
45
+
46
+ #specific drivers
47
+ self.datasetlist = drivers.datasetlist()
48
+
49
+ #core drivers: build one driver per YAML group, sharing a single query executor.
50
+ etdb = _QueryExecutor(
51
+ baseRequest = self.__connectInfo.baseRequest,
52
+ userSettings = self.__connectInfo.userSettings,
53
+ )
54
+ for dbGroupName in (entry['group'] for entry in _load_datasetlist()):
55
+ default_db_name, db_functions = _make_group_functions(dbGroupName, etdb)
56
+ default_db = db_functions[default_db_name]
57
+ attr_name = _GROUP_ALIASES.get(dbGroupName, dbGroupName.lower())
58
+ setattr(self, attr_name, DriverGroup(attr_name, default_db, db_functions))
59
+
60
+ def __call__(self, *args: Any, **kwargs: Any) -> Any:
61
+ return getattr(self, 'series')(*args, **kwargs)
62
+
63
+ def ts(self, *args: Any, **kwargs: Any) -> Any:
64
+ """Quick time-series query — shortcut for ``self.series(...)``.
65
+
66
+ A list or tuple of series IDs can be passed to fetch multiple series
67
+ and merge them into a single ``DataFrame`` with one column per series.
68
+ """
69
+ if (
70
+ len(args) == 1
71
+ and isinstance(args[0], (list, tuple))
72
+ and all(isinstance(t, str) for t in args[0])
73
+ ):
74
+ tickers = list(args[0])
75
+ if not tickers:
76
+ return pd.DataFrame()
77
+
78
+ kwargs.pop('verbose', None)
79
+
80
+ frames: list[pd.DataFrame] = []
81
+ meta: dict[str, Any] = {}
82
+ for ticker in tickers:
83
+ df = self.series(ticker, **kwargs) # type: ignore[attr-defined]
84
+ frames.append(df)
85
+ meta[ticker] = df.attrs.get('meta', {})
86
+
87
+ combined = pd.concat(frames, axis=1, sort=True)
88
+ combined.attrs['meta'] = meta
89
+ return combined
90
+
91
+ return self.series(*args, **kwargs) # type: ignore[attr-defined]
92
+
93
+ def __str__(self) -> str:
94
+ return self.__doc__ or ''
95
+
96
+
97
+ # Backward-compatible alias for internal code/tests.
98
+ _data = Client
@@ -0,0 +1,109 @@
1
+ r'''
2
+ Code snippet generation for reproducing queries with requests directly.
3
+ '''
4
+
5
+ import json
6
+ import logging
7
+ from textwrap import dedent
8
+ from typing import Any
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class _CodeSnippetBuilder:
14
+ def build(
15
+ self,
16
+ query: dict[str, Any],
17
+ baseRequest: dict[str, Any],
18
+ userSettings: dict[str, Any] | None = None,
19
+ pandasCode: str = "",
20
+ ) -> str:
21
+ if userSettings is None:
22
+ userSettings = {}
23
+ #load code header - get keys
24
+ apiCode = self._api_code(query,userSettings)
25
+
26
+ #load request's code
27
+ queryCode = self._query_code(query,baseRequest,pandasCode)
28
+
29
+ return(apiCode + queryCode)
30
+
31
+ def _query_code(self, query: dict[str, Any], baseRequest: dict[str, Any], pandasCode: str = "") -> str:
32
+ queryClean = {'url':query['url'],'params':query['params']} #passing only these two entries of query; params_dict is dropped.
33
+ queryClean['url'] = 'url'
34
+ queryClean['params']=queryClean['params'].replace(baseRequest['params']['api_key'],'{}')+'.format(key)' #replace explicit api key by the var "key" poiting to it.
35
+
36
+ queryCode = '''\
37
+ query = {}
38
+ retrivedData = requests.get(**query)
39
+
40
+ {} #replace json by xml if this is the request format
41
+ '''
42
+
43
+ queryCode = dedent(queryCode).format(json.dumps(queryClean),pandasCode)
44
+ queryCode = queryCode.replace('"url": "url"', '"url": url')
45
+ queryCode = queryCode.replace('.format(key)"', '".format(key)')
46
+ queryCode = queryCode.replace('"UserID": "key"', '"UserID": key') #TODO: need to handle generic case, UserID, api_key...
47
+ return(queryCode)
48
+
49
+ def _api_code(self, query: dict[str, Any], userSettings: dict[str, Any]) -> str:
50
+ r'''
51
+ The base format of a code that can be used to replicate a driver using Requests directly.
52
+ '''
53
+ try:
54
+ url = query['url']
55
+ apiKeyPath = userSettings['ApiKeysPath']
56
+ apiKeyLabel = userSettings["ApiKeyLabel"]
57
+ except (KeyError, AttributeError, TypeError) as e:
58
+ logger.debug('Incomplete connection information for code snippet: %s', e)
59
+ url = " incomplete connection information "
60
+ apiKeyPath = " incomplete connection information "
61
+ apiKeyLabel = ""
62
+
63
+ storagePref = apiKeyPath.split('.')[-1]
64
+
65
+ passToCode = {'ApiKeyLabel': apiKeyLabel, "url":url, 'ApiKeysPath':apiKeyPath}
66
+
67
+ code = self._api_code_options(storagePref)
68
+ code = code.format(**passToCode)
69
+
70
+ return(code)
71
+
72
+ def _api_code_options(self, storagePref: str) -> str:
73
+ r''''
74
+ storagePref: yaml, json, env
75
+ '''
76
+ if storagePref == 'yaml':
77
+ code = '''\
78
+ import requests
79
+ import yaml
80
+ import pandas as pd
81
+
82
+ apiKeysFile = '{ApiKeysPath}'
83
+ with open(apiKeysFile, 'r') as stream:
84
+ apiInfo= yaml.safe_load(stream)
85
+ url,key = apiInfo['{ApiKeyLabel}']['url'], apiInfo['{ApiKeyLabel}']['key']
86
+ '''
87
+ elif storagePref == 'json':
88
+ code = '''\
89
+ import requests
90
+ import json
91
+ import pandas as pd
92
+
93
+ # json file should contain: {"BEA":{"key":"YOUR KEY","url": "{url}" }
94
+
95
+ apiKeysFile = '{ApiKeysPath}'
96
+ with open(apiKeysFile) as jsonFile:
97
+ apiInfo = json.load(jsonFile)
98
+ url,key = apiInfo['{ApiKeyLabel}']['url'], apiInfo['{ApiKeyLabel}']['key']
99
+ '''
100
+ else: #default to env
101
+ code = '''\
102
+ import requests
103
+ import os
104
+ import pandas as pd
105
+
106
+ url = "{url}"
107
+ key = os.getenv("{ApiKeyLabel}")
108
+ '''
109
+ return(dedent(code))
File without changes