libaditya 0.3.4__py2.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 (131) hide show
  1. libaditya/__init__.py +46 -0
  2. libaditya/_version.py +29 -0
  3. libaditya/calc/__init__.py +9 -0
  4. libaditya/calc/api.py +30 -0
  5. libaditya/calc/avasthas.py +346 -0
  6. libaditya/calc/docs/jaimini-get-arch.md +95 -0
  7. libaditya/calc/hellenistic.py +37 -0
  8. libaditya/calc/jaimini.py +335 -0
  9. libaditya/calc/jaimini_get.py +240 -0
  10. libaditya/calc/kala.py +73 -0
  11. libaditya/calc/panchanga.py +422 -0
  12. libaditya/calc/rashi.py +612 -0
  13. libaditya/calc/returns.py +50 -0
  14. libaditya/calc/swe_functions.py +118 -0
  15. libaditya/calc/varga.py +287 -0
  16. libaditya/calc/vimshottari.py +431 -0
  17. libaditya/cards/__init__.py +5 -0
  18. libaditya/cards/card.py +90 -0
  19. libaditya/cards/cards_constants.py +115 -0
  20. libaditya/cards/cards_of_truth.py +323 -0
  21. libaditya/cards/cot.py +142 -0
  22. libaditya/cards/deck.py +52 -0
  23. libaditya/charts/__init__.py +6 -0
  24. libaditya/charts/api.py +36 -0
  25. libaditya/charts/bodygraph.py +80 -0
  26. libaditya/charts/chart.py +286 -0
  27. libaditya/charts/jaimini.py +83 -0
  28. libaditya/charts/tajika.py +36 -0
  29. libaditya/constants.py +1776 -0
  30. libaditya/draw/__init__.py +20 -0
  31. libaditya/draw/draw_bodygraph.py +489 -0
  32. libaditya/draw/draw_sbc.py +712 -0
  33. libaditya/draw/themes/default-theme.hd +53 -0
  34. libaditya/ephe/ast0/se00010s.se1 +0 -0
  35. libaditya/ephe/seas_00.se1 +0 -0
  36. libaditya/ephe/seas_06.se1 +0 -0
  37. libaditya/ephe/seas_12.se1 +0 -0
  38. libaditya/ephe/seas_18.se1 +0 -0
  39. libaditya/ephe/seas_24.se1 +0 -0
  40. libaditya/ephe/seas_30.se1 +0 -0
  41. libaditya/ephe/seas_36.se1 +0 -0
  42. libaditya/ephe/seas_42.se1 +0 -0
  43. libaditya/ephe/seas_48.se1 +0 -0
  44. libaditya/ephe/seasm06.se1 +0 -0
  45. libaditya/ephe/seasm12.se1 +0 -0
  46. libaditya/ephe/seasm18.se1 +0 -0
  47. libaditya/ephe/seasm24.se1 +0 -0
  48. libaditya/ephe/seasm30.se1 +0 -0
  49. libaditya/ephe/seasm36.se1 +0 -0
  50. libaditya/ephe/seasm42.se1 +0 -0
  51. libaditya/ephe/seasm48.se1 +0 -0
  52. libaditya/ephe/seasm54.se1 +0 -0
  53. libaditya/ephe/sefstars.txt +4245 -0
  54. libaditya/ephe/semo_00.se1 +0 -0
  55. libaditya/ephe/semo_06.se1 +0 -0
  56. libaditya/ephe/semo_12.se1 +0 -0
  57. libaditya/ephe/semo_18.se1 +0 -0
  58. libaditya/ephe/semo_24.se1 +0 -0
  59. libaditya/ephe/semo_30.se1 +0 -0
  60. libaditya/ephe/semo_36.se1 +0 -0
  61. libaditya/ephe/semo_42.se1 +0 -0
  62. libaditya/ephe/semo_48.se1 +0 -0
  63. libaditya/ephe/semom06.se1 +0 -0
  64. libaditya/ephe/semom12.se1 +0 -0
  65. libaditya/ephe/semom18.se1 +0 -0
  66. libaditya/ephe/semom24.se1 +0 -0
  67. libaditya/ephe/semom30.se1 +0 -0
  68. libaditya/ephe/semom36.se1 +0 -0
  69. libaditya/ephe/semom42.se1 +0 -0
  70. libaditya/ephe/semom48.se1 +0 -0
  71. libaditya/ephe/semom54.se1 +0 -0
  72. libaditya/ephe/sepl_00.se1 +0 -0
  73. libaditya/ephe/sepl_06.se1 +0 -0
  74. libaditya/ephe/sepl_12.se1 +0 -0
  75. libaditya/ephe/sepl_18.se1 +0 -0
  76. libaditya/ephe/sepl_24.se1 +0 -0
  77. libaditya/ephe/sepl_30.se1 +0 -0
  78. libaditya/ephe/sepl_36.se1 +0 -0
  79. libaditya/ephe/sepl_42.se1 +0 -0
  80. libaditya/ephe/sepl_48.se1 +0 -0
  81. libaditya/ephe/seplm06.se1 +0 -0
  82. libaditya/ephe/seplm12.se1 +0 -0
  83. libaditya/ephe/seplm18.se1 +0 -0
  84. libaditya/ephe/seplm24.se1 +0 -0
  85. libaditya/ephe/seplm30.se1 +0 -0
  86. libaditya/ephe/seplm36.se1 +0 -0
  87. libaditya/ephe/seplm42.se1 +0 -0
  88. libaditya/ephe/seplm48.se1 +0 -0
  89. libaditya/ephe/seplm54.se1 +0 -0
  90. libaditya/hd/__init__.py +8 -0
  91. libaditya/hd/calc.py +55 -0
  92. libaditya/hd/constants.py +127 -0
  93. libaditya/hd/longitude.py +271 -0
  94. libaditya/objects/__init__.py +19 -0
  95. libaditya/objects/celestial_object.py +206 -0
  96. libaditya/objects/context.py +133 -0
  97. libaditya/objects/cusps.py +259 -0
  98. libaditya/objects/julian_day.py +265 -0
  99. libaditya/objects/location.py +167 -0
  100. libaditya/objects/longitude.py +987 -0
  101. libaditya/objects/nakshatras.py +285 -0
  102. libaditya/objects/planets.py +2059 -0
  103. libaditya/objects/shadbala.py +398 -0
  104. libaditya/objects/signs.py +690 -0
  105. libaditya/objects/swe_functions.py +75 -0
  106. libaditya/print_functions.py +548 -0
  107. libaditya/read.py +665 -0
  108. libaditya/stars/__init__.py +4 -0
  109. libaditya/stars/fixed_star.py +216 -0
  110. libaditya/stars/make_swe_stars.py +407 -0
  111. libaditya/stars/star-sign-boundaries +44 -0
  112. libaditya/stars/stellarium/__init__.py +6 -0
  113. libaditya/stars/stellarium/remote_control/__init__.py +22 -0
  114. libaditya/stars/stellarium/remote_control/location.py +82 -0
  115. libaditya/stars/stellarium/remote_control/locationsearch.py +35 -0
  116. libaditya/stars/stellarium/remote_control/main.py +165 -0
  117. libaditya/stars/stellarium/remote_control/objects.py +63 -0
  118. libaditya/stars/stellarium/remote_control/scripts.py +81 -0
  119. libaditya/stars/stellarium/remote_control/simbad.py +20 -0
  120. libaditya/stars/stellarium/remote_control/stelaction.py +31 -0
  121. libaditya/stars/stellarium/remote_control/stelproperty.py +30 -0
  122. libaditya/stars/stellarium/remote_control/view.py +85 -0
  123. libaditya/stars/stellarium/stellarium.py +92 -0
  124. libaditya/stars/the_stars.py +522 -0
  125. libaditya/stars/utilities.py +539 -0
  126. libaditya/utils.py +431 -0
  127. libaditya/write.py +67 -0
  128. libaditya-0.3.4.dist-info/METADATA +588 -0
  129. libaditya-0.3.4.dist-info/RECORD +131 -0
  130. libaditya-0.3.4.dist-info/WHEEL +5 -0
  131. libaditya-0.3.4.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,286 @@
1
+ # This file is part of libaditya.
2
+ #
3
+ # Copyright (c) 2025 Josh Harper <humanhaven@substack.com>
4
+ #
5
+ # libaditya is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # libaditya is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with libaditya. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ import os
19
+ import pathlib
20
+ from dataclasses import replace
21
+ import swisseph as swe
22
+
23
+ from libaditya import constants as const
24
+
25
+ from libaditya.objects import EphContext, Circle, JulianDay
26
+ from libaditya.calc import Varga, Rashi
27
+ from libaditya.cards import CardsOfTruth
28
+ import libaditya.stars as stars
29
+
30
+ from .api import API
31
+ from .bodygraph import Bodygraph
32
+
33
+
34
+ class Chart(API):
35
+ """
36
+ the primary interface into libaditya is the Chart
37
+ Chart is a collection of vargas
38
+
39
+ it explicity includes a Rashi chart Chart.rashi()
40
+ any implemented varga can gotten by Chart.varga(varga_code)
41
+
42
+ can return a new Chart that has different options set
43
+ aditya(),tropical(),sidereal() all have certain options they set, any others can be passed as keyword arguments, e.g., ayanamsa=27
44
+ defaults are documented in those functions
45
+
46
+ Jaimini and Tajika inherit from Chart, and they are here to give syntactic functionality to this
47
+ simply for ease of use; explained more in a code comment
48
+
49
+ the actually functionality is provided through Varga and on down.
50
+
51
+ where the syntax for chart=Chart() is chart.jaimini().first_strength()
52
+ .first_strength() actually belongs to Varga...so on any varga you can call
53
+ Varga.jaimini_first_strength()
54
+
55
+ not sure this syntax is really worth it? leaving it for now
56
+ """
57
+ libaditya_path = os.path.dirname(pathlib.Path(__file__).parent)
58
+ ephe_path = libaditya_path + "/ephe/"
59
+
60
+ _initializing_ecliptic = False
61
+
62
+ def __init__(self, context=EphContext()):
63
+ swe.set_ephe_path(self.ephe_path)
64
+ self.context = context
65
+ self._Rashi = Rashi(self.context,self)
66
+ if not Chart._initializing_ecliptic:
67
+ Chart._initializing_ecliptic = True
68
+ try:
69
+ self._Ecliptic = self.ecliptic()
70
+ finally:
71
+ Chart._initializing_ecliptic = False
72
+
73
+ def __repr__(self):
74
+ return self.rashi().__str__()
75
+
76
+ def __str__(self):
77
+ return self.__repr__()
78
+
79
+ def chart(self):
80
+ return self
81
+
82
+ def rashi(self, n=None):
83
+ # pass an integer to Chart().rashi(), get the varga...just to make it easier for me sometimes
84
+ if n is not None:
85
+ return self.varga(n)
86
+ return self._Rashi
87
+
88
+ # natal() is meant to be an api feature for western/hellenistic/other astrologers
89
+ # who may feel more comfortable with that
90
+ # the same features are accessible using both names
91
+ def natal(self):
92
+ return self.rashi()
93
+
94
+ def bodygraph(self):
95
+ return Bodygraph(self.context)
96
+
97
+ def varga(self, amsha: int):
98
+ """
99
+ use Chart.rashi() for the rashi() chart
100
+
101
+ you must pass an integer to varga
102
+
103
+ 1-N for positive integers make a parivritti varga of that amsha
104
+
105
+ special vargas have negative integer codes
106
+ these vargas all have deities associated with the amsha in various ways
107
+ these can be accessed by Planet/Cusp.deity() (really, it is Longitude.deity()...
108
+ Longitude is where basically all of the Aditya/Zodiac and varga calculations are managed)
109
+
110
+ -2 Hora; Sun and Moon, same stays, opposite goes opposite
111
+ -3 Drekkana;
112
+ -4 Chaturthamsha
113
+ -10 Dashamsha
114
+ -100 Dashamsha with Even Rashis going in reverse
115
+ -12 Dvadashamsha
116
+ -16 Shodashamsha
117
+ -20 Vimshamsha
118
+ -24 Parashara Chaturvimshamsha
119
+ -240 Siddhamsha
120
+ -27 Bhamsha
121
+ -40 Khdavedamsha
122
+ -45 Akshavedamsha
123
+ -60 Shashtyamsha
124
+ """
125
+
126
+ return Varga(self.context,amsha)
127
+
128
+ def saptavargas(self):
129
+ """
130
+ return a list of of the saptaVargas
131
+ i.e., 1, -2, -3, 7, 9, -12, 30
132
+ """
133
+ saptavargas = [1,-2,-3,7,9,-12,30]
134
+ return [Varga(self.context,amsha) for amsha in saptavargas]
135
+
136
+ # do the other groups of vargas, dasha, etc.
137
+
138
+ # jaimini and tajika
139
+ # these inherit from Chart, then Chart calls them here, which is why there is a local import statement
140
+ # the reason is that i like to have the syntax, e.g., chart.jaimini().pada()
141
+ # i could make a Mixin like with Varga and calc.Jaimini, then the syntax would be
142
+ # chart.jaimini_pada(), chart.tajika_vargas(); but for some reason, i want to be able to write, chart.tajika()
143
+ # really, if you want to really use that chart, then do tajika_chart = chart.tajika()
144
+ # jaimini and tajika really just contain wrappers and syntax for that functionality
145
+ # the calculation is also done lower, e.g., in Varga
146
+
147
+ def jaimini(self):
148
+ from libaditya.charts import Jaimini
149
+ return Jaimini(context=self.context)
150
+
151
+ def tajika(self):
152
+ from libaditya.charts import Tajika
153
+ return Tajika(context=self.context)
154
+
155
+ def aditya(self, **kwargs):
156
+ """
157
+ take the current EphContext and change what is needed to make it a tropical Aditya chart
158
+
159
+ sysflg=const.TROP
160
+ circle=Circle.ADITYA
161
+ names=replace(self.context.names,sign_names=const.adityas)
162
+
163
+ **kwargs can take any keyword argument that can be used for EphContext
164
+ so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
165
+ """
166
+ return Chart(context=replace(self.context,sysflg=const.TROP,circle=Circle.ADITYA,sign_names="adityas",**kwargs))
167
+
168
+ def tropical(self, **kwargs):
169
+ """
170
+ take the current EphContext and change what is needed to make it a tropical zodiac chart
171
+
172
+ sysflg=const.TROP
173
+ circle=Circle.ZODIAC
174
+ names=replace(self.context.names,sign_names=const.zodiac)
175
+
176
+ **kwargs can take any keyword argument that can be used for EphContext
177
+ so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
178
+ """
179
+ return Chart(context=replace(self.context,sysflg=const.TROP,circle=Circle.ZODIAC,sign_names="zodiac",**kwargs))
180
+
181
+ def sidereal(self, ayanamsa=27, **kwargs):
182
+ """
183
+ take the current EphContext and change what is needed to make it a sidereal zodiac chart
184
+
185
+ sysflg=const.SID
186
+ circle=Circle.ZODIAC
187
+ sign_names=sign_names=const.zodiac
188
+ ayanamsa=27, True Citra ayanamsa by default; use Chart.sidereal(ayanamsa=n) to set the ayanamsa
189
+
190
+ **kwargs can take any keyword argument that can be used for EphContext
191
+ so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
192
+ """
193
+ return Chart(context=replace(self.context,sysflg=const.SID,ayanamsa=ayanamsa,circle=Circle.ZODIAC,sign_names="zodiac",**kwargs))
194
+
195
+ def heliocentric(self, **kwargs):
196
+ """
197
+ take the current EphContext and change what is needed to make it a heliocentric chart
198
+
199
+ sysflg=const.HELIO
200
+
201
+ **kwargs can take any keyword argument that can be used for EphContext
202
+ so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
203
+ """
204
+ return Chart(context=replace(self.context,sysflg=const.HELIO,**kwargs))
205
+
206
+ def barycentric(self, **kwargs):
207
+ """
208
+ take the current EphContext and change what is needed to make it a barycentric chart
209
+
210
+ sysflg=const.BARY
211
+
212
+ **kwargs can take any keyword argument that can be used for EphContext
213
+ so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
214
+ """
215
+ return Chart(context=replace(self.context,sysflg=const.BARY,**kwargs))
216
+
217
+ def cot(self, **kwargs):
218
+ """
219
+ create a CardsOfTruth instantce for this context
220
+ """
221
+ return CardsOfTruth(context=replace(self.context,**kwargs),master=self.rashi())
222
+
223
+ def draconic(self, **kwargs):
224
+ """
225
+ take the current EphContext and change what is needed to make it a draconic chart
226
+
227
+ sysflg=const.DRAC
228
+
229
+ **kwargs can take any keyword argument that can be used for EphContext
230
+ so if you want to change the ayanamsa, pass Chart.aditya(ayanamsa=27) and it will give you a new chart for that
231
+ """
232
+ return Chart(context=replace(self.context,sysflg=const.DRAC,**kwargs))
233
+
234
+ def shift(self, dir, unit, number, **kwargs):
235
+ """
236
+ calls self.JulianDay effectively and return a Chart with shifted JulianDay
237
+ """
238
+ return Chart(context=replace(self.context,timeJD=self.context.timeJD.shift(dir,unit,number),**kwargs))
239
+
240
+ def timejd(self, next_time):
241
+ """
242
+ shift the time only
243
+ current next_time only accepts a julianday number
244
+ carries along the timezone from this context
245
+ """
246
+ if isinstance(next_time, float):
247
+ return Chart(context=replace(self.context,timeJD=JulianDay(next_time,self.context.timeJD.utcoffset)))
248
+
249
+ def now(self):
250
+ """
251
+ return a chart like this one but for right now
252
+ """
253
+ return Chart(context=replace(self.context,timeJD=JulianDay("now",self.context.timeJD.utcoffset)))
254
+
255
+ def _new_chart(self, **kwargs):
256
+ """
257
+ return a Chart replacing anything in this EphContext by **kwargs
258
+ e.g., Chart.new_chart(hsys='R', ayanamsa=27) will return this Chart but using Regiomontanus house system
259
+ and True Citra ayanamsa, all the other options staying the same
260
+
261
+ be very careful with this as there are no protections on the option combinations and you could
262
+ easily choose a combination of options that doesnt really make sense
263
+ """
264
+ return Chart(context=replace(self.context,**kwargs))
265
+
266
+ def _new_context(self, context):
267
+ """
268
+ return a Chart replacing anything in this EphContext by **kwargs
269
+ e.g., Chart.new_chart(hsys='R', ayanamsa=27) will return this Chart but using Regiomontanus house system
270
+ and True Citra ayanamsa, all the other options staying the same
271
+
272
+ be very careful with this as there are no protections on the option combinations and you could
273
+ easily choose a combination of options that doesnt really make sense
274
+ """
275
+ return Chart(context)
276
+
277
+ def stars(self,stellarium=False):
278
+ """
279
+ this is TheStars, used when you know the nomenclature name of the star, the (,)noMen name, because they all look a bit like that
280
+ this is implemented so that you can choose or not to put the ","
281
+ """
282
+ return stars.TheStars(self.context,stellarium)
283
+
284
+ def ecliptic(self):
285
+ self_true_sidereal = self.sidereal(ayanamsa=97,signize=False)
286
+ return stars.the_stars.Ecliptic(self_true_sidereal.context,master=self)
@@ -0,0 +1,83 @@
1
+ # This file is part of libaditya.
2
+ #
3
+ # Copyright (c) 2025 Josh Harper <humanhaven@substack.com>
4
+ #
5
+ # libaditya is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # libaditya is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with libaditya. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ from libaditya.objects import EphContext
19
+ from libaditya.charts import Chart
20
+
21
+ class Jaimini(Chart):
22
+
23
+ def __init__(self, context=EphContext()):
24
+ super().__init__(context)
25
+ self.ak = self.atmakaraka # so you can call chart.jaimini().ak()
26
+
27
+ def pada(self, amsha=1):
28
+ if amsha == 1:
29
+ return self.rashi().pada()
30
+ return self.varga(amsha).pada()
31
+
32
+ def upapada(self, amsha=1):
33
+ if amsha == 1:
34
+ return self.rashi().upapada()
35
+ return self.varga(amsha).upapada()
36
+
37
+ def padas(self, amsha=1):
38
+ if amsha == 1:
39
+ return self.rashi().padas()
40
+ return self.varga(amsha).padas()
41
+
42
+ def karakas(self):
43
+ """
44
+ get the Jaimini karakas for this Chart/Jaimini
45
+ """
46
+ return self.rashi().planets().jaimini_karakas()
47
+
48
+ def atmakaraka(self):
49
+ return self.karakas()[0]
50
+
51
+ def svamsha(self):
52
+ """
53
+ returns the Sign that the AK is in in the navamsha
54
+ """
55
+ return self.varga(9).signs()[self.varga(9).where_is(self.atmakaraka()).sign()]
56
+
57
+ def karakamsha(self):
58
+ return self.rashi().signs()[self.atmakaraka().sign()]
59
+
60
+ def darakaraka(self):
61
+ # there are 7 karakas, python is 0-indexed, so 6 is the 7th starting from 0
62
+ return self.karakas()[6]
63
+
64
+ def first_strength(self, amsha=1):
65
+ if amsha == 1:
66
+ return self.rashi().jaimini_first_strength()
67
+ else:
68
+ return self.varga(amsha).jaimini_first_strength()
69
+
70
+ def second_strength(self, amsha=1):
71
+ if amsha == 1:
72
+ return self.rashi().jaimini_second_strength()
73
+ else:
74
+ return self.varga(amsha).jaimini_second_strength()
75
+
76
+ def argala(self):
77
+ """
78
+ determine the argala in this chart
79
+ this means combined argala to 1st and 7th houses in the Rashi chart
80
+
81
+ the deepest python function for argala will be able to do it to any sign in any varga
82
+ """
83
+ return self.rashi().rashi_argala()
@@ -0,0 +1,36 @@
1
+ # This file is part of libaditya.
2
+ #
3
+ # Copyright (c) 2025 Josh Harper <humanhaven@substack.com>
4
+ #
5
+ # libaditya is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # libaditya is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with libaditya. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ from libaditya.objects import EphContext
19
+ from libaditya.charts import Chart
20
+
21
+ class Tajika(Chart):
22
+
23
+ def __init__(self, context=EphContext()):
24
+ super().__init__(context)
25
+
26
+ def vargas(self) -> {int: "varga"}:
27
+ """
28
+ return a dictionary of tajika parivritti vargas
29
+ 1-12 in a dictionary {int: Sign}
30
+ also 30, since it is sometimes used
31
+ """
32
+ vargas = {}
33
+ for n in range(1,13):
34
+ vargas[n] = self.varga(n)
35
+ vargas[30] = self.varga(30)
36
+ return vargas