squirrels 0.4.0__py3-none-any.whl → 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.

Potentially problematic release.


This version of squirrels might be problematic. Click here for more details.

Files changed (125) hide show
  1. dateutils/__init__.py +6 -0
  2. dateutils/_enums.py +25 -0
  3. squirrels/dateutils.py → dateutils/_implementation.py +58 -111
  4. dateutils/types.py +6 -0
  5. squirrels/__init__.py +13 -11
  6. squirrels/_api_routes/__init__.py +5 -0
  7. squirrels/_api_routes/auth.py +271 -0
  8. squirrels/_api_routes/base.py +165 -0
  9. squirrels/_api_routes/dashboards.py +150 -0
  10. squirrels/_api_routes/data_management.py +145 -0
  11. squirrels/_api_routes/datasets.py +257 -0
  12. squirrels/_api_routes/oauth2.py +298 -0
  13. squirrels/_api_routes/project.py +252 -0
  14. squirrels/_api_server.py +256 -450
  15. squirrels/_arguments/__init__.py +0 -0
  16. squirrels/_arguments/init_time_args.py +108 -0
  17. squirrels/_arguments/run_time_args.py +147 -0
  18. squirrels/_auth.py +960 -0
  19. squirrels/_command_line.py +126 -45
  20. squirrels/_compile_prompts.py +147 -0
  21. squirrels/_connection_set.py +48 -26
  22. squirrels/_constants.py +68 -38
  23. squirrels/_dashboards.py +160 -0
  24. squirrels/_data_sources.py +570 -0
  25. squirrels/_dataset_types.py +84 -0
  26. squirrels/_exceptions.py +29 -0
  27. squirrels/_initializer.py +177 -80
  28. squirrels/_logging.py +115 -0
  29. squirrels/_manifest.py +208 -79
  30. squirrels/_model_builder.py +69 -0
  31. squirrels/_model_configs.py +74 -0
  32. squirrels/_model_queries.py +52 -0
  33. squirrels/_models.py +926 -367
  34. squirrels/_package_data/base_project/.env +42 -0
  35. squirrels/_package_data/base_project/.env.example +42 -0
  36. squirrels/_package_data/base_project/assets/expenses.db +0 -0
  37. squirrels/_package_data/base_project/connections.yml +16 -0
  38. squirrels/_package_data/base_project/dashboards/dashboard_example.py +34 -0
  39. squirrels/_package_data/base_project/dashboards/dashboard_example.yml +22 -0
  40. squirrels/{package_data → _package_data}/base_project/docker/.dockerignore +5 -2
  41. squirrels/{package_data → _package_data}/base_project/docker/Dockerfile +3 -3
  42. squirrels/{package_data → _package_data}/base_project/docker/compose.yml +1 -1
  43. squirrels/_package_data/base_project/duckdb_init.sql +10 -0
  44. squirrels/{package_data/base_project/.gitignore → _package_data/base_project/gitignore} +3 -2
  45. squirrels/_package_data/base_project/macros/macros_example.sql +17 -0
  46. squirrels/_package_data/base_project/models/builds/build_example.py +26 -0
  47. squirrels/_package_data/base_project/models/builds/build_example.sql +16 -0
  48. squirrels/_package_data/base_project/models/builds/build_example.yml +57 -0
  49. squirrels/_package_data/base_project/models/dbviews/dbview_example.sql +12 -0
  50. squirrels/_package_data/base_project/models/dbviews/dbview_example.yml +26 -0
  51. squirrels/_package_data/base_project/models/federates/federate_example.py +37 -0
  52. squirrels/_package_data/base_project/models/federates/federate_example.sql +19 -0
  53. squirrels/_package_data/base_project/models/federates/federate_example.yml +65 -0
  54. squirrels/_package_data/base_project/models/sources.yml +38 -0
  55. squirrels/{package_data → _package_data}/base_project/parameters.yml +56 -40
  56. squirrels/_package_data/base_project/pyconfigs/connections.py +14 -0
  57. squirrels/{package_data → _package_data}/base_project/pyconfigs/context.py +21 -40
  58. squirrels/_package_data/base_project/pyconfigs/parameters.py +141 -0
  59. squirrels/_package_data/base_project/pyconfigs/user.py +44 -0
  60. squirrels/_package_data/base_project/seeds/seed_categories.yml +15 -0
  61. squirrels/_package_data/base_project/seeds/seed_subcategories.csv +15 -0
  62. squirrels/_package_data/base_project/seeds/seed_subcategories.yml +21 -0
  63. squirrels/_package_data/base_project/squirrels.yml.j2 +61 -0
  64. squirrels/_package_data/templates/dataset_results.html +112 -0
  65. squirrels/_package_data/templates/oauth_login.html +271 -0
  66. squirrels/_package_data/templates/squirrels_studio.html +20 -0
  67. squirrels/_package_loader.py +8 -4
  68. squirrels/_parameter_configs.py +104 -103
  69. squirrels/_parameter_options.py +348 -0
  70. squirrels/_parameter_sets.py +57 -47
  71. squirrels/_parameters.py +1664 -0
  72. squirrels/_project.py +721 -0
  73. squirrels/_py_module.py +7 -5
  74. squirrels/_schemas/__init__.py +0 -0
  75. squirrels/_schemas/auth_models.py +167 -0
  76. squirrels/_schemas/query_param_models.py +75 -0
  77. squirrels/{_api_response_models.py → _schemas/response_models.py} +126 -47
  78. squirrels/_seeds.py +35 -16
  79. squirrels/_sources.py +110 -0
  80. squirrels/_utils.py +248 -73
  81. squirrels/_version.py +1 -1
  82. squirrels/arguments.py +7 -0
  83. squirrels/auth.py +4 -0
  84. squirrels/connections.py +3 -0
  85. squirrels/dashboards.py +2 -81
  86. squirrels/data_sources.py +14 -631
  87. squirrels/parameter_options.py +13 -348
  88. squirrels/parameters.py +14 -1266
  89. squirrels/types.py +16 -0
  90. squirrels-0.5.0.dist-info/METADATA +113 -0
  91. squirrels-0.5.0.dist-info/RECORD +97 -0
  92. {squirrels-0.4.0.dist-info → squirrels-0.5.0.dist-info}/WHEEL +1 -1
  93. squirrels-0.5.0.dist-info/entry_points.txt +3 -0
  94. {squirrels-0.4.0.dist-info → squirrels-0.5.0.dist-info/licenses}/LICENSE +1 -1
  95. squirrels/_authenticator.py +0 -85
  96. squirrels/_dashboards_io.py +0 -61
  97. squirrels/_environcfg.py +0 -84
  98. squirrels/arguments/init_time_args.py +0 -40
  99. squirrels/arguments/run_time_args.py +0 -208
  100. squirrels/package_data/assets/favicon.ico +0 -0
  101. squirrels/package_data/assets/index.css +0 -1
  102. squirrels/package_data/assets/index.js +0 -58
  103. squirrels/package_data/base_project/assets/expenses.db +0 -0
  104. squirrels/package_data/base_project/connections.yml +0 -7
  105. squirrels/package_data/base_project/dashboards/dashboard_example.py +0 -32
  106. squirrels/package_data/base_project/dashboards.yml +0 -10
  107. squirrels/package_data/base_project/env.yml +0 -29
  108. squirrels/package_data/base_project/models/dbviews/dbview_example.py +0 -47
  109. squirrels/package_data/base_project/models/dbviews/dbview_example.sql +0 -22
  110. squirrels/package_data/base_project/models/federates/federate_example.py +0 -21
  111. squirrels/package_data/base_project/models/federates/federate_example.sql +0 -3
  112. squirrels/package_data/base_project/pyconfigs/auth.py +0 -45
  113. squirrels/package_data/base_project/pyconfigs/connections.py +0 -19
  114. squirrels/package_data/base_project/pyconfigs/parameters.py +0 -95
  115. squirrels/package_data/base_project/seeds/seed_subcategories.csv +0 -15
  116. squirrels/package_data/base_project/squirrels.yml.j2 +0 -94
  117. squirrels/package_data/templates/index.html +0 -18
  118. squirrels/project.py +0 -378
  119. squirrels/user_base.py +0 -55
  120. squirrels-0.4.0.dist-info/METADATA +0 -117
  121. squirrels-0.4.0.dist-info/RECORD +0 -60
  122. squirrels-0.4.0.dist-info/entry_points.txt +0 -4
  123. /squirrels/{package_data → _package_data}/base_project/assets/weather.db +0 -0
  124. /squirrels/{package_data → _package_data}/base_project/seeds/seed_categories.csv +0 -0
  125. /squirrels/{package_data → _package_data}/base_project/tmp/.gitignore +0 -0
dateutils/__init__.py ADDED
@@ -0,0 +1,6 @@
1
+ from ._enums import DayOfWeekEnum, MonthEnum
2
+ from ._implementation import (
3
+ DayIdxOfMonthsCycle, DayIdxOfYear, DayIdxOfQuarter, DayIdxOfMonth, DayIdxOfWeek,
4
+ OffsetYears, OffsetMonths, OffsetWeeks, OffsetDays,
5
+ DateModPipeline, DateStringModifier, TimestampModifier
6
+ )
dateutils/_enums.py ADDED
@@ -0,0 +1,25 @@
1
+ from enum import Enum
2
+
3
+
4
+ class DayOfWeekEnum(Enum):
5
+ Sunday = 0
6
+ Monday = 1
7
+ Tuesday = 2
8
+ Wednesday = 3
9
+ Thursday = 4
10
+ Friday = 5
11
+ Saturday = 6
12
+
13
+ class MonthEnum(Enum):
14
+ January = 1
15
+ February = 2
16
+ March = 3
17
+ April = 4
18
+ May = 5
19
+ June = 6
20
+ July = 7
21
+ August = 8
22
+ September = 9
23
+ October = 10
24
+ November = 11
25
+ December = 12
@@ -3,33 +3,8 @@ from dataclasses import dataclass
3
3
  from datetime import date as Date, datetime
4
4
  from dateutil.relativedelta import relativedelta
5
5
  from abc import ABCMeta, abstractmethod
6
- from enum import Enum
7
-
8
- from . import _utils as _u
9
-
10
-
11
- class DayOfWeek(Enum):
12
- Sunday = 0
13
- Monday = 1
14
- Tuesday = 2
15
- Wednesday = 3
16
- Thursday = 4
17
- Friday = 5
18
- Saturday = 6
19
-
20
- class Month(Enum):
21
- January = 1
22
- February = 2
23
- March = 3
24
- April = 4
25
- May = 5
26
- June = 6
27
- July = 7
28
- August = 8
29
- September = 9
30
- October = 10
31
- November = 11
32
- December = 12
6
+
7
+ from ._enums import DayOfWeekEnum, MonthEnum
33
8
 
34
9
 
35
10
  class DateModifier(metaclass=ABCMeta):
@@ -54,20 +29,21 @@ class DateModifier(metaclass=ABCMeta):
54
29
  return datetype(year, month, day)
55
30
 
56
31
 
57
- class _DayIdxOfCalendarUnit(DateModifier):
32
+ @dataclass
33
+ class DayIdxOfCalendarUnit(DateModifier):
58
34
  """
59
35
  Interface for adjusting a date to some day of calendar unit
60
36
  """
61
- def __init__(self, idx: int) -> None:
62
- super().__init__()
63
- self.idx = idx
37
+ idx: int
38
+
39
+ def __post_init__(self) -> None:
64
40
  if self.idx == 0:
65
- raise _u.ConfigurationError(f"For constructors of class names that start with DayIdxOf_, idx cannot be zero")
41
+ raise ValueError(f"For constructors of class names that start with DayIdxOf_, idx cannot be zero")
66
42
  self.incr = self.idx - 1 if self.idx > 0 else self.idx
67
43
 
68
44
 
69
45
  @dataclass
70
- class DayIdxOfMonthsCycle(_DayIdxOfCalendarUnit):
46
+ class DayIdxOfMonthsCycle(DayIdxOfCalendarUnit):
71
47
  """
72
48
  DateModifier class to get the idx-th day of a cycle of months for an input date
73
49
 
@@ -76,23 +52,21 @@ class DayIdxOfMonthsCycle(_DayIdxOfCalendarUnit):
76
52
  num_months_in_cycle: 2 for one 6th of year, 3 for Quarter, 4 for one 3rd of year, 6 for half year, 12 for full year. Must fit evenly in 12
77
53
  first_month_of_cycle: The first month of months cycle of year. Default is January
78
54
  """
79
- _num_months_in_cycle: int
80
- _first_month_of_cycle: Month
55
+ num_months_in_cycle: int
56
+ first_month_of_cycle: MonthEnum = MonthEnum.January
81
57
 
82
- def __init__(self, idx: int, num_months_in_cycle: int, first_month_of_cycle: Month = Month.January) -> None:
83
- super().__init__(idx)
84
- self._num_months_in_cycle = num_months_in_cycle
85
- self._first_month_of_cycle = first_month_of_cycle
86
- if 12 % self._num_months_in_cycle != 0:
87
- raise _u.ConfigurationError(f"Value X must fit evenly in 12")
88
- self.first_month_of_first_cycle = (self._first_month_of_cycle.value - 1) % self._num_months_in_cycle + 1
58
+ def __post_init__(self) -> None:
59
+ super().__post_init__()
60
+ if 12 % self.num_months_in_cycle != 0:
61
+ raise ValueError(f"Argument 'num_months_in_cycle' must fit evenly in 12")
62
+ self.first_month_of_first_cycle = (self.first_month_of_cycle.value - 1) % self.num_months_in_cycle + 1
89
63
 
90
64
  def modify(self, date: Date) -> Date:
91
- current_cycle = (date.month - self.first_month_of_first_cycle) % 12 // self._num_months_in_cycle
92
- first_month_of_curr_cycle = current_cycle * self._num_months_in_cycle + self.first_month_of_first_cycle
65
+ current_cycle = (date.month - self.first_month_of_first_cycle) % 12 // self.num_months_in_cycle
66
+ first_month_of_curr_cycle = current_cycle * self.num_months_in_cycle + self.first_month_of_first_cycle
93
67
  year = date.year if date.month >= first_month_of_curr_cycle else date.year - 1
94
68
  first_day = self._get_date(type(date), year, first_month_of_curr_cycle, 1)
95
- ref_date = first_day if self.idx > 0 else first_day + relativedelta(months=self._num_months_in_cycle)
69
+ ref_date = first_day if self.idx > 0 else first_day + relativedelta(months=self.num_months_in_cycle)
96
70
  return ref_date + relativedelta(days=self.incr)
97
71
 
98
72
 
@@ -106,7 +80,7 @@ class DayIdxOfYear(DayIdxOfMonthsCycle):
106
80
  first_month_of_year: The first month of year. Default is January
107
81
  """
108
82
 
109
- def __init__(self, idx: int, first_month_of_year: Month = Month.January):
83
+ def __init__(self, idx: int, first_month_of_year: MonthEnum = MonthEnum.January):
110
84
  super().__init__(idx, num_months_in_cycle=12, first_month_of_cycle=first_month_of_year)
111
85
 
112
86
 
@@ -120,12 +94,12 @@ class DayIdxOfQuarter(DayIdxOfMonthsCycle):
120
94
  first_month_of_quarter: The first month of first quarter. Default is January
121
95
  """
122
96
 
123
- def __init__(self, idx: int, first_month_of_quarter: Month = Month.January):
97
+ def __init__(self, idx: int, first_month_of_quarter: MonthEnum = MonthEnum.January):
124
98
  super().__init__(idx, num_months_in_cycle=3, first_month_of_cycle=first_month_of_quarter)
125
99
 
126
100
 
127
101
  @dataclass
128
- class DayIdxOfMonth(_DayIdxOfCalendarUnit):
102
+ class DayIdxOfMonth(DayIdxOfCalendarUnit):
129
103
  """
130
104
  DateModifier class to get the idx-th day of month of an input date
131
105
 
@@ -133,9 +107,6 @@ class DayIdxOfMonth(_DayIdxOfCalendarUnit):
133
107
  idx: 1 for first, 2 for second, etc. Or, -1 for last, -2 for second last, etc. Must not be 0
134
108
  """
135
109
 
136
- def __init__(self, idx: int) -> None:
137
- super().__init__(idx)
138
-
139
110
  def modify(self, date: Date) -> Date:
140
111
  first_day = self._get_date(type(date), date.year, date.month, 1)
141
112
  ref_date = first_day if self.idx > 0 else first_day + relativedelta(months=1)
@@ -143,7 +114,7 @@ class DayIdxOfMonth(_DayIdxOfCalendarUnit):
143
114
 
144
115
 
145
116
  @dataclass
146
- class DayIdxOfWeek(_DayIdxOfCalendarUnit):
117
+ class DayIdxOfWeek(DayIdxOfCalendarUnit):
147
118
  """
148
119
  DateModifier class to get the idx-th day of week of an input date
149
120
 
@@ -151,12 +122,11 @@ class DayIdxOfWeek(_DayIdxOfCalendarUnit):
151
122
  idx: 1 for first, 2 for second, etc. Or, -1 for last, -2 for second last, etc. Must not be 0
152
123
  first_day_of_week: The day of week identified as the "first". Default is Monday
153
124
  """
154
- _first_day_of_week: DayOfWeek
125
+ first_day_of_week: DayOfWeekEnum = DayOfWeekEnum.Monday
155
126
 
156
- def __init__(self, idx: int, first_day_of_week: DayOfWeek = DayOfWeek.Monday) -> None:
157
- super().__init__(idx)
158
- self._first_day_of_week = first_day_of_week
159
- self.first_dow_num = self._first_day_of_week.value
127
+ def __post_init__(self) -> None:
128
+ super().__post_init__()
129
+ self.first_dow_num = self.first_day_of_week.value
160
130
 
161
131
  def modify(self, date: Date) -> Date:
162
132
  distance_from_first_day = (1 + date.weekday() - self.first_dow_num) % 7
@@ -164,17 +134,16 @@ class DayIdxOfWeek(_DayIdxOfCalendarUnit):
164
134
  return date + relativedelta(days=total_incr)
165
135
 
166
136
 
167
- class _OffsetUnits(DateModifier):
137
+ @dataclass
138
+ class OffsetUnits(DateModifier):
168
139
  """
169
140
  Abstract DateModifier class to offset an input date by some number of some calendar unit
170
141
  """
171
- def __init__(self, offset: int) -> None:
172
- super().__init__()
173
- self.offset = offset
142
+ offset: int
174
143
 
175
144
 
176
145
  @dataclass
177
- class OffsetYears(_OffsetUnits):
146
+ class OffsetYears(OffsetUnits):
178
147
  """
179
148
  DateModifier class to offset an input date by some number of years
180
149
 
@@ -182,15 +151,12 @@ class OffsetYears(_OffsetUnits):
182
151
  offset: The number of years to offset the input date.
183
152
  """
184
153
 
185
- def __init__(self, offset: int) -> None:
186
- super().__init__(offset)
187
-
188
154
  def modify(self, date: Date) -> Date:
189
155
  return date + relativedelta(years=self.offset)
190
156
 
191
157
 
192
158
  @dataclass
193
- class OffsetMonths(_OffsetUnits):
159
+ class OffsetMonths(OffsetUnits):
194
160
  """
195
161
  DateModifier class to offset an input date by some number of months
196
162
 
@@ -198,15 +164,12 @@ class OffsetMonths(_OffsetUnits):
198
164
  offset: The number of months to offset the input date.
199
165
  """
200
166
 
201
- def __init__(self, offset: int) -> None:
202
- super().__init__(offset)
203
-
204
167
  def modify(self, date: Date) -> Date:
205
168
  return date + relativedelta(months=self.offset)
206
169
 
207
170
 
208
171
  @dataclass
209
- class OffsetWeeks(_OffsetUnits):
172
+ class OffsetWeeks(OffsetUnits):
210
173
  """
211
174
  DateModifier class to offset an input date by some number of weeks
212
175
 
@@ -214,15 +177,12 @@ class OffsetWeeks(_OffsetUnits):
214
177
  offset: The number of weeks to offset the input date.
215
178
  """
216
179
 
217
- def __init__(self, offset: int) -> None:
218
- super().__init__(offset)
219
-
220
180
  def modify(self, date: Date) -> Date:
221
181
  return date + relativedelta(weeks=self.offset)
222
182
 
223
183
 
224
184
  @dataclass
225
- class OffsetDays(_OffsetUnits):
185
+ class OffsetDays(OffsetUnits):
226
186
  """
227
187
  DateModifier class to offset an input date by some number of days
228
188
 
@@ -230,9 +190,6 @@ class OffsetDays(_OffsetUnits):
230
190
  offset: The number of days to offset the input date.
231
191
  """
232
192
 
233
- def __init__(self, offset: int) -> None:
234
- super().__init__(offset)
235
-
236
193
  def modify(self, date: Date) -> Date:
237
194
  return date + relativedelta(days=self.offset)
238
195
 
@@ -245,14 +202,10 @@ class DateModPipeline(DateModifier):
245
202
  Attributes:
246
203
  modifiers: The list of DateModifier's to apply in sequence.
247
204
  """
248
- _date_modifiers: Sequence[DateModifier]
205
+ date_modifiers: Sequence[DateModifier]
249
206
 
250
- def __init__(self, date_modifiers: Sequence[DateModifier]) -> None:
251
- super().__init__()
252
- self._date_modifiers = tuple(date_modifiers)
253
-
254
207
  def modify(self, date: Date) -> Date:
255
- for modifier in self._date_modifiers:
208
+ for modifier in self.date_modifiers:
256
209
  date = modifier.modify(date)
257
210
  return date
258
211
 
@@ -267,7 +220,7 @@ class DateModPipeline(DateModifier):
267
220
  Returns:
268
221
  A new sequence of DateModifier
269
222
  """
270
- joined_modifiers = tuple(self._date_modifiers) + tuple(date_modifiers)
223
+ joined_modifiers = tuple(self.date_modifiers) + tuple(date_modifiers)
271
224
  return joined_modifiers
272
225
 
273
226
  def with_more_modifiers(self, date_modifiers: Sequence[DateModifier]):
@@ -300,9 +253,9 @@ class DateModPipeline(DateModifier):
300
253
  Returns:
301
254
  A list of datetime objects
302
255
  """
303
- assert isinstance(step, _OffsetUnits)
256
+ assert isinstance(step, OffsetUnits)
304
257
  if step.offset == 0:
305
- raise _u.ConfigurationError(f"The length of 'step' must not be zero")
258
+ raise ValueError(f"The length of 'step' must not be zero")
306
259
 
307
260
  output: Sequence[Date] = []
308
261
  end_date = self.modify(start_date)
@@ -315,12 +268,15 @@ class DateModPipeline(DateModifier):
315
268
  return output
316
269
 
317
270
 
318
- class _DateRepresentationModifier(metaclass=ABCMeta):
271
+ @dataclass
272
+ class DateRepresentationModifier(metaclass=ABCMeta):
319
273
  """
320
274
  Abstract class for modifying other representations of dates (such as string or unix timestemp)
321
275
  """
322
- def __init__(self, date_modifiers: Sequence[DateModifier]):
323
- self.date_modifier = DateModPipeline(date_modifiers)
276
+ date_modifiers: Sequence[DateModifier]
277
+
278
+ def __post_init__(self) -> None:
279
+ self.date_mod_pipeline = DateModPipeline(self.date_modifiers)
324
280
 
325
281
  @abstractmethod
326
282
  def with_more_modifiers(self, date_modifiers: Sequence[DateModifier]):
@@ -328,7 +284,7 @@ class _DateRepresentationModifier(metaclass=ABCMeta):
328
284
 
329
285
 
330
286
  @dataclass
331
- class DateStringModifier(_DateRepresentationModifier):
287
+ class DateStringModifier(DateRepresentationModifier):
332
288
  """
333
289
  Class to modify a string representation of a date given a DateModifier
334
290
 
@@ -336,12 +292,7 @@ class DateStringModifier(_DateRepresentationModifier):
336
292
  date_modifier: The DateModifier to apply on datetime objects
337
293
  date_format: Format of the output date string. Default is '%Y-%m-%d'
338
294
  """
339
- _date_modifiers: Sequence[DateModifier]
340
- _date_format: str
341
-
342
- def __init__(self, date_modifiers: Sequence[DateModifier], date_format: str = '%Y-%m-%d'):
343
- super().__init__(date_modifiers)
344
- self._date_format = date_format
295
+ date_format: str = '%Y-%m-%d'
345
296
 
346
297
  def with_more_modifiers(self, date_modifiers: Sequence[DateModifier]):
347
298
  """
@@ -353,11 +304,11 @@ class DateStringModifier(_DateRepresentationModifier):
353
304
  Returns:
354
305
  A new DateStringModifier
355
306
  """
356
- joined_modifiers = self.date_modifier.get_joined_modifiers(date_modifiers)
357
- return DateStringModifier(joined_modifiers, self._date_format)
307
+ joined_modifiers = self.date_mod_pipeline.get_joined_modifiers(date_modifiers)
308
+ return DateStringModifier(joined_modifiers, self.date_format)
358
309
 
359
310
  def _get_input_date_obj(self, date_str: str, input_format: str | None = None) -> Date:
360
- input_format = self._date_format if input_format is None else input_format
311
+ input_format = self.date_format if input_format is None else input_format
361
312
  return datetime.strptime(date_str, input_format).date()
362
313
 
363
314
  def modify(self, date_str: str, input_format: str | None = None) -> str:
@@ -372,7 +323,7 @@ class DateStringModifier(_DateRepresentationModifier):
372
323
  The resulting date string
373
324
  """
374
325
  date_obj = self._get_input_date_obj(date_str, input_format)
375
- return self.date_modifier.modify(date_obj).strftime(self._date_format)
326
+ return self.date_mod_pipeline.modify(date_obj).strftime(self.date_format)
376
327
 
377
328
  def get_date_list(self, start_date_str: str, step: DateModifier, input_format: str | None = None) -> Sequence[str]:
378
329
  """
@@ -392,14 +343,14 @@ class DateStringModifier(_DateRepresentationModifier):
392
343
  Returns:
393
344
  A list of date strings
394
345
  """
395
- assert isinstance(step, _OffsetUnits)
346
+ assert isinstance(step, OffsetUnits)
396
347
  curr_date = self._get_input_date_obj(start_date_str, input_format)
397
- output = self.date_modifier.get_date_list(curr_date, step)
398
- return [x.strftime(self._date_format) for x in output]
348
+ output = self.date_mod_pipeline.get_date_list(curr_date, step)
349
+ return [x.strftime(self.date_format) for x in output]
399
350
 
400
351
 
401
352
  @dataclass
402
- class TimestampModifier(_DateRepresentationModifier):
353
+ class TimestampModifier(DateRepresentationModifier):
403
354
  """
404
355
  Class to modify a numeric representation of a date (as Unix/Epoch/POSIX timestamp) given a DateModifier
405
356
 
@@ -407,10 +358,6 @@ class TimestampModifier(_DateRepresentationModifier):
407
358
  date_modifier: The DateModifier to apply on datetime objects
408
359
  date_format: Format of the date string. Default is '%Y-%m-%d'
409
360
  """
410
- _date_modifiers: Sequence[DateModifier]
411
-
412
- def __init__(self, date_modifiers: Sequence[DateModifier]):
413
- super().__init__(date_modifiers)
414
361
 
415
362
  def with_more_modifiers(self, date_modifiers: Sequence[DateModifier]):
416
363
  """
@@ -422,7 +369,7 @@ class TimestampModifier(_DateRepresentationModifier):
422
369
  Returns:
423
370
  A new TimestampModifier
424
371
  """
425
- joined_modifiers = self.date_modifier.get_joined_modifiers(date_modifiers)
372
+ joined_modifiers = self.date_mod_pipeline.get_joined_modifiers(date_modifiers)
426
373
  return TimestampModifier(joined_modifiers)
427
374
 
428
375
  def modify(self, timestamp: float) -> float:
@@ -436,7 +383,7 @@ class TimestampModifier(_DateRepresentationModifier):
436
383
  The resulting timestamp
437
384
  """
438
385
  date_obj = datetime.fromtimestamp(timestamp).date()
439
- modified_date = self.date_modifier.modify(date_obj)
386
+ modified_date = self.date_mod_pipeline.modify(date_obj)
440
387
  modified_datetime = datetime.combine(modified_date, datetime.min.time())
441
388
  return modified_datetime.timestamp()
442
389
 
@@ -458,5 +405,5 @@ class TimestampModifier(_DateRepresentationModifier):
458
405
  A list of timestamp as floats
459
406
  """
460
407
  curr_date = datetime.fromtimestamp(start_timestamp).date()
461
- output = self.date_modifier.get_date_list(curr_date, step)
408
+ output = self.date_mod_pipeline.get_date_list(curr_date, step)
462
409
  return [datetime.combine(x, datetime.min.time()).timestamp() for x in output]
dateutils/types.py ADDED
@@ -0,0 +1,6 @@
1
+ from ._implementation import (
2
+ DateModifier,
3
+ DayIdxOfCalendarUnit,
4
+ OffsetUnits,
5
+ DateRepresentationModifier
6
+ )
squirrels/__init__.py CHANGED
@@ -1,19 +1,21 @@
1
1
  from ._version import __version__
2
2
 
3
- from .arguments.init_time_args import ConnectionsArgs, ParametersArgs
4
- from .arguments.run_time_args import AuthArgs, ContextArgs, ModelDepsArgs, ModelArgs, DashboardArgs
3
+ from .arguments import *
5
4
 
6
- from .parameter_options import SelectParameterOption, DateParameterOption, DateRangeParameterOption
7
- from .parameter_options import NumberParameterOption, NumberRangeParameterOption, TextParameterOption
5
+ from .auth import *
8
6
 
9
- from .parameters import SingleSelectParameter, MultiSelectParameter, DateParameter, DateRangeParameter
10
- from .parameters import NumberParameter, NumberRangeParameter, TextParameter, TextValue
7
+ from .connections import *
11
8
 
12
- from .data_sources import SingleSelectDataSource, MultiSelectDataSource, SelectDataSource, DateDataSource, DateRangeDataSource
13
- from .data_sources import NumberDataSource, NumberRangeDataSource, TextDataSource
9
+ from .parameter_options import *
14
10
 
15
- from .user_base import User, WrongPassword
11
+ from .parameters import *
16
12
 
17
- from .dashboards import PngDashboard, HtmlDashboard
13
+ from .data_sources import *
18
14
 
19
- from .project import SquirrelsProject
15
+ from .dashboards import *
16
+
17
+ from .types import *
18
+
19
+ from ._project import SquirrelsProject
20
+
21
+ __all__ = ["SquirrelsProject"]
@@ -0,0 +1,5 @@
1
+ """
2
+ API Routes Package
3
+
4
+ This package contains modular route definitions for the Squirrels API server.
5
+ """