arvi 0.1.12__py3-none-any.whl → 0.1.13__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 arvi might be problematic. Click here for more details.

arvi/timeseries.py CHANGED
@@ -11,16 +11,16 @@ import numpy as np
11
11
  from astropy import units
12
12
 
13
13
  from .setup_logger import logger
14
- from .config import return_self, check_internet
14
+ from .config import return_self, check_internet, debug
15
15
  from .translations import translate
16
- from .dace_wrapper import do_download_filetype, get_observations, get_arrays
16
+ from .dace_wrapper import do_download_filetype, do_symlink_filetype, get_observations, get_arrays
17
17
  from .simbad_wrapper import simbad
18
18
  from .gaia_wrapper import gaia
19
19
  from .extra_data import get_extra_data
20
20
  from .stats import wmean, wrms
21
21
  from .binning import bin_ccf_mask, binRV
22
22
  from .HZ import getHZ_period
23
- from .utils import strtobool, there_is_internet
23
+ from .utils import strtobool, there_is_internet, timer
24
24
 
25
25
 
26
26
  @dataclass
@@ -102,8 +102,10 @@ class RV:
102
102
  if self.verbose:
103
103
  logger.info(f'querying DACE for {self.__star__}...')
104
104
  try:
105
- self.dace_result = get_observations(self.__star__, self.instrument,
106
- verbose=self.verbose)
105
+ with timer():
106
+ self.dace_result = get_observations(self.__star__, self.instrument,
107
+ main_id=self.simbad.main_id,
108
+ verbose=self.verbose)
107
109
  except ValueError as e:
108
110
  # querying DACE failed, should we raise an error?
109
111
  if self._raise_on_error:
@@ -257,6 +259,10 @@ class RV:
257
259
  table += ' | '.join(map(str, self.NN.values())) + '\n'
258
260
  return table
259
261
 
262
+ @property
263
+ def point(self):
264
+ return [(t.round(4), v.round(4), sv.round(4)) for t, v, sv in zip(self.time, self.vrad, self.svrad)]
265
+
260
266
  @property
261
267
  def mtime(self) -> np.ndarray:
262
268
  """ Masked array of times """
@@ -566,7 +572,7 @@ class RV:
566
572
  return s
567
573
 
568
574
 
569
- def _check_instrument(self, instrument, strict=False):# -> list | None:
575
+ def _check_instrument(self, instrument, strict=False, log=False):# -> list | None:
570
576
  """
571
577
  Check if there are observations from `instrument`.
572
578
 
@@ -599,6 +605,11 @@ class RV:
599
605
  if any([instrument in inst for inst in self.instruments]):
600
606
  return [inst for inst in self.instruments if instrument in inst]
601
607
 
608
+ if log:
609
+ logger.error(f"No data from instrument '{instrument}'")
610
+ logger.info(f'available: {self.instruments}')
611
+ return
612
+
602
613
 
603
614
  def _build_arrays(self):
604
615
  """ build all concatenated arrays of `self` from each of the `.inst`s """
@@ -643,7 +654,8 @@ class RV:
643
654
  setattr(self, q, arr)
644
655
 
645
656
 
646
- def download_ccf(self, instrument=None, index=None, limit=None, directory=None, **kwargs):
657
+ def download_ccf(self, instrument=None, index=None, limit=None,
658
+ directory=None, symlink=False, **kwargs):
647
659
  """ Download CCFs from DACE
648
660
 
649
661
  Args:
@@ -671,9 +683,15 @@ class RV:
671
683
  # remove empty strings
672
684
  files = list(filter(None, files))
673
685
 
674
- do_download_filetype('CCF', files[:limit], directory, **kwargs)
686
+ if symlink:
687
+ if 'top_level' not in kwargs:
688
+ logger.warning('may need to provide `top_level` in kwargs to find file')
689
+ do_symlink_filetype('CCF', files[:limit], directory, **kwargs)
690
+ else:
691
+ do_download_filetype('CCF', files[:limit], directory, verbose=self.verbose, **kwargs)
675
692
 
676
- def download_s1d(self, instrument=None, index=None, limit=None, directory=None, **kwargs):
693
+ def download_s1d(self, instrument=None, index=None, limit=None,
694
+ directory=None, symlink=False, **kwargs):
677
695
  """ Download S1Ds from DACE
678
696
 
679
697
  Args:
@@ -701,9 +719,15 @@ class RV:
701
719
  # remove empty strings
702
720
  files = list(filter(None, files))
703
721
 
704
- do_download_filetype('S1D', files[:limit], directory, **kwargs)
722
+ if symlink:
723
+ if 'top_level' not in kwargs:
724
+ logger.warning('may need to provide `top_level` in kwargs to find file')
725
+ do_symlink_filetype('S1D', files[:limit], directory, **kwargs)
726
+ else:
727
+ do_download_filetype('S1D', files[:limit], directory, verbose=self.verbose, **kwargs)
705
728
 
706
- def download_s2d(self, instrument=None, index=None, limit=None, directory=None, **kwargs):
729
+ def download_s2d(self, instrument=None, index=None, limit=None,
730
+ directory=None, symlink=False, **kwargs):
707
731
  """ Download S2Ds from DACE
708
732
 
709
733
  Args:
@@ -731,11 +755,16 @@ class RV:
731
755
  # remove empty strings
732
756
  files = list(filter(None, files))
733
757
 
734
- do_download_filetype('S2D', files[:limit], directory, **kwargs)
758
+ if symlink:
759
+ if 'top_level' not in kwargs:
760
+ logger.warning('may need to provide `top_level` in kwargs to find file')
761
+ do_symlink_filetype('S2D', files[:limit], directory, **kwargs)
762
+ else:
763
+ do_download_filetype('S2D', files[:limit], directory, verbose=self.verbose, **kwargs)
735
764
 
736
765
 
737
- from .plots import plot, plot_fwhm, plot_bis, plot_rhk, plot_quantity
738
- from .plots import gls, gls_fwhm, gls_bis, gls_rhk
766
+ from .plots import plot, plot_fwhm, plot_bis, plot_rhk, plot_berv, plot_quantity
767
+ from .plots import gls, gls_fwhm, gls_bis, gls_rhk, window_function
739
768
  from .reports import report
740
769
 
741
770
  from .instrument_specific import known_issues
@@ -1023,8 +1052,37 @@ class RV:
1023
1052
  self._build_arrays()
1024
1053
 
1025
1054
  self._did_secular_acceleration = True
1055
+ self._did_secular_acceleration_epoch = epoch
1056
+ self._did_secular_acceleration_simbad = force_simbad
1057
+
1026
1058
  if return_self:
1027
1059
  return self
1060
+
1061
+ def _undo_secular_acceleration(self):
1062
+ if self._did_secular_acceleration:
1063
+ _old_verbose = self.verbose
1064
+ self.verbose = False
1065
+ sa = self.secular_acceleration(just_compute=True,
1066
+ force_simbad=self._did_secular_acceleration_simbad)
1067
+ self.verbose = _old_verbose
1068
+ sa = sa.value
1069
+
1070
+ if self._child:
1071
+ self.vrad = self.vrad + sa * (self.time - self._did_secular_acceleration_epoch) / 365.25
1072
+ else:
1073
+ for inst in self.instruments:
1074
+ if 'HIRES' in inst: # never remove it from HIRES...
1075
+ continue
1076
+ if 'NIRPS' in inst: # never remove it from NIRPS...
1077
+ continue
1078
+
1079
+ s = getattr(self, inst)
1080
+
1081
+ s.vrad = s.vrad + sa * (s.time - self._did_secular_acceleration_epoch) / 365.25
1082
+
1083
+ self._build_arrays()
1084
+
1085
+ self._did_secular_acceleration = False
1028
1086
 
1029
1087
  def sigmaclip(self, sigma=5, instrument=None, strict=True):
1030
1088
  """ Sigma-clip RVs (per instrument!) """
@@ -1220,6 +1278,11 @@ class RV:
1220
1278
  for inst in self.instruments:
1221
1279
  s = getattr(self, inst)
1222
1280
 
1281
+ if s.mtime.size == 0:
1282
+ if self.verbose:
1283
+ logger.info(f'all observations of {inst} are masked')
1284
+ continue
1285
+
1223
1286
  if s.N == 1:
1224
1287
  if self.verbose:
1225
1288
  msg = (f'only 1 observation for {inst}, '
@@ -1231,28 +1294,37 @@ class RV:
1231
1294
 
1232
1295
  s.rv_mean = wmean(s.mvrad, s.msvrad)
1233
1296
  s.vrad -= s.rv_mean
1297
+
1234
1298
  if self.verbose:
1235
1299
  logger.info(f'subtracted weighted average from {inst:10s}: ({s.rv_mean:.3f} {self.units})')
1300
+
1236
1301
  if just_rv:
1237
1302
  continue
1238
- # log_msg = 'same for '
1303
+
1239
1304
  for i, other in enumerate(others):
1240
1305
  y, ye = getattr(s, other), getattr(s, other + '_err')
1241
1306
  m = wmean(y[s.mask], ye[s.mask])
1242
1307
  setattr(s, f'{other}_mean', m)
1243
1308
  setattr(s, other, getattr(s, other) - m)
1244
- # log_msg += other
1245
- # if i < len(others) - 1:
1246
- # log_msg += ', '
1247
-
1248
- # if self.verbose:
1249
- # logger.info(log_msg)
1250
1309
 
1251
1310
  self._build_arrays()
1252
1311
  self._did_adjust_means = True
1253
1312
  if return_self:
1254
1313
  return self
1255
1314
 
1315
+ def add_to_vrad(self, values):
1316
+ """ Add an array of values to the RVs of all instruments """
1317
+ if values.size != self.vrad.size:
1318
+ raise ValueError(f"incompatible sizes: len(values) must equal self.N, got {values.size} != {self.vrad.size}")
1319
+
1320
+ for inst in self.instruments:
1321
+ s = getattr(self, inst)
1322
+ mask = self.instrument_array == inst
1323
+ s.vrad += values[mask]
1324
+
1325
+ self._build_arrays()
1326
+
1327
+
1256
1328
  def put_at_systemic_velocity(self):
1257
1329
  """
1258
1330
  For instruments in which mean(RV) < ptp(RV), "move" RVs to the systemic
@@ -1492,22 +1564,50 @@ class RV:
1492
1564
  return self._planets
1493
1565
 
1494
1566
 
1495
- def fit_sine(t, y, yerr, period='gls', fix_period=False):
1567
+ def fit_sine(t, y, yerr=None, period='gls', fix_period=False):
1568
+ """ Fit a sine curve of the form y = A * sin(2π * t / P + φ) + c
1569
+
1570
+ Args:
1571
+ t (ndarray):
1572
+ Time array
1573
+ y (ndarray):
1574
+ Array of observed values
1575
+ yerr (ndarray, optional):
1576
+ Array of uncertainties. Defaults to None.
1577
+ period (str or float, optional):
1578
+ Initial guess for period or 'gls' to get it from Lomb-Scargle
1579
+ periodogram. Defaults to 'gls'.
1580
+ fix_period (bool, optional):
1581
+ Whether to fix the period. Defaults to False.
1582
+
1583
+ Returns:
1584
+ p (ndarray):
1585
+ Best-fit parameters [A, P, φ, c] or [A, φ, c]
1586
+ f (callable):
1587
+ Function that returns the best-fit sine curve for input times
1588
+ """
1496
1589
  from scipy.optimize import leastsq
1497
1590
  if period == 'gls':
1498
1591
  from astropy.timeseries import LombScargle
1499
1592
  gls = LombScargle(t, y, yerr)
1500
1593
  freq, power = gls.autopower()
1501
1594
  period = 1 / freq[power.argmax()]
1502
-
1503
- if fix_period and period is None:
1504
- logger.error('period is fixed but no value provided')
1505
- return
1506
-
1507
- def sine(t, p):
1508
- return p[0] * np.sin(2 * np.pi * t / p[1] + p[2]) + p[3]
1509
-
1510
- p0 = [y.ptp(), period, 0.0, 0.0]
1511
- xbest, _ = leastsq(lambda p, t, y, ye: (sine(t, p) - y) / ye,
1512
- p0, args=(t, y, yerr))
1595
+ else:
1596
+ period = float(period)
1597
+
1598
+ if yerr is None:
1599
+ yerr = np.ones_like(y)
1600
+
1601
+ if fix_period:
1602
+ def sine(t, p):
1603
+ return p[0] * np.sin(2 * np.pi * t / period + p[1]) + p[2]
1604
+ f = lambda p, t, y, ye: (sine(t, p) - y) / ye
1605
+ p0 = [y.ptp(), 0.0, 0.0]
1606
+ else:
1607
+ def sine(t, p):
1608
+ return p[0] * np.sin(2 * np.pi * t / p[1] + p[2]) + p[3]
1609
+ f = lambda p, t, y, ye: (sine(t, p) - y) / ye
1610
+ p0 = [y.ptp(), period, 0.0, 0.0]
1611
+
1612
+ xbest, _ = leastsq(f, p0, args=(t, y, yerr))
1513
1613
  return xbest, partial(sine, p=xbest)
arvi/utils.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import time
2
3
  from contextlib import contextmanager
3
4
  try:
4
5
  from unittest.mock import patch
@@ -19,6 +20,9 @@ except ImportError:
19
20
  tqdm = lambda x, *args, **kwargs: x
20
21
  trange = lambda *args, **kwargs: range(*args, **kwargs)
21
22
 
23
+ from .setup_logger import logger
24
+ from . import config
25
+
22
26
 
23
27
  def create_directory(directory):
24
28
  """ Create a directory if it does not exist """
@@ -61,6 +65,23 @@ def all_logging_disabled():
61
65
  finally:
62
66
  logging.disable(previous_level)
63
67
 
68
+
69
+ @contextmanager
70
+ def timer():
71
+ """ A simple context manager to time a block of code """
72
+ if not config.debug:
73
+ yield
74
+ return
75
+
76
+ logger.debug(f'starting timer')
77
+ start = time.time()
78
+ try:
79
+ yield
80
+ finally:
81
+ end = time.time()
82
+ logger.debug(f'elapsed time: {end - start:.2f} seconds')
83
+
84
+
64
85
  def strtobool(val):
65
86
  """Convert a string representation of truth to true (1) or false (0).
66
87
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arvi
3
- Version: 0.1.12
3
+ Version: 0.1.13
4
4
  Summary: The Automated RV Inspector
5
5
  Author-email: João Faria <joao.faria@unige.ch>
6
6
  License: MIT
@@ -0,0 +1,32 @@
1
+ arvi/HZ.py,sha256=u7rguhlILRBW-LOczlY3dkIB4LM8p8W7Xfg4FnNaYG0,2850
2
+ arvi/__init__.py,sha256=cECMjLbPiolmft2lsnNoszU6_1a-dKOVY8cb2D1CBfg,366
3
+ arvi/ariadne_wrapper.py,sha256=jv8Wl35LfHl1UH1EklbvxHcQHqaEDhRGNogSYjFt7Y4,2141
4
+ arvi/binning.py,sha256=jJ_resqSvfI-2BT0cnGPFckTIei_k2Mk95oZyE5b5zQ,15250
5
+ arvi/config.py,sha256=wyj6FTxN7QOZj8LaHAe_ZdPKVfrNfobNNOHRNLH-S7Q,339
6
+ arvi/dace_wrapper.py,sha256=VjC1YjZ7URkHkgRO7rUKjkxBtdMMjoEqcqTtZQ8M7NY,17034
7
+ arvi/extra_data.py,sha256=WEEaYeLh52Zdv0uyHO72Ys5MWS3naTAP4wJV2BJ1mbk,2551
8
+ arvi/gaia_wrapper.py,sha256=YxqqlWkLAKBY7AGHfDpNbkOLYWK0lt0L5GZenn0FfxM,3555
9
+ arvi/instrument_specific.py,sha256=fhkvR5jJzpJH7XbT8Fbzkaz6tGeoFYugkJCIAJgSR7o,4746
10
+ arvi/lbl_wrapper.py,sha256=_ViGVkpakvuBR_xhu9XJRV5EKHpj5Go6jBZGJZMIS2Y,11850
11
+ arvi/nasaexo_wrapper.py,sha256=mWt7eHgSZe4MBKCmUvMPTyUPGuiwGTqKugNBvmjOg9s,7306
12
+ arvi/plots.py,sha256=2W1IwUeMdNq5--l6nQXn3EFft0UQgEyPyudRxTCRM40,25566
13
+ arvi/programs.py,sha256=WpFE2cXYG-4ax2xmih0fFhvQbcVhnOEofVcwjePNmKQ,4505
14
+ arvi/reports.py,sha256=yrdajC-zz5_kH1Ucc6cU70DK-5dpG0Xyeru-EITKpNo,3355
15
+ arvi/setup_logger.py,sha256=pBzaRTn0hntozjbaRVx0JIbWGuENkvYUApa6uB-FsRo,279
16
+ arvi/simbad_wrapper.py,sha256=fwO0NbMvxAW3RyC58FPkLjXqLs9OkRyK0sYcb0ZVBQA,5571
17
+ arvi/spectra.py,sha256=pTAWSW4vk96DWRQ-6l5mNJHUhiAyaPR-QDjZdOT6Ak0,7489
18
+ arvi/stats.py,sha256=MQiyLvdiAFxIC29uajTy8kuxD-b2Y6mraL4AfWkRJkM,2576
19
+ arvi/timeseries.py,sha256=PCQntiNK8MnlgKeyGOTd4BrQXm8NSjZRtGfLa4hfaE0,58257
20
+ arvi/translations.py,sha256=AljjMsHRqzfcirdeavHsyVJFLvwKrM1wDLMv2RApG58,446
21
+ arvi/utils.py,sha256=nuIOuUdysMesWF9ute4v-kbeo6DylWjWW-SJhCsHn9I,4078
22
+ arvi/data/info.svg,sha256=0IMI6W-eFoTD8acnury79WJJakpBwLa4qKS4JWpsXiI,489
23
+ arvi/data/obs_affected_ADC_issues.dat,sha256=tn93uOL0eCTYhireqp1wG-_c3CbxPA7C-Rf-pejVY8M,10853
24
+ arvi/data/obs_affected_blue_cryostat_issues.dat,sha256=z4AK17xfz8tGTDv1FjRvQFnio4XA6PNNfDXuicewHk4,1771
25
+ arvi/data/extra/HD86226_PFS1.rdb,sha256=vfAozbrKHM_j8dYkCBJsuHyD01KEM1asghe2KInwVao,3475
26
+ arvi/data/extra/HD86226_PFS2.rdb,sha256=F2P7dB6gVyzCglUjNheB0hIHVClC5RmARrGwbrY1cfo,4114
27
+ arvi/data/extra/metadata.json,sha256=C69hIw6CohyES6BI9vDWjxwSz7N4VOYX0PCgjXtYFmU,178
28
+ arvi-0.1.13.dist-info/LICENSE,sha256=6JfQgl7SpM55t0EHMFNMnNh-AdkpGW25MwMiTnhdWQg,1068
29
+ arvi-0.1.13.dist-info/METADATA,sha256=9wDBsoyGzFt-Eo186zVKLVJT_VdUlr_2C2uzrqQ5Fxs,1306
30
+ arvi-0.1.13.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
31
+ arvi-0.1.13.dist-info/top_level.txt,sha256=4EeiKDVLD45ztuflTGfQ3TU8GVjJg5Y95xS5XjI-utU,5
32
+ arvi-0.1.13.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,31 +0,0 @@
1
- arvi/HZ.py,sha256=btqDFTxHeQlmvXOQKrjOpP8YFtmFjGhSZwsYYehLOaM,2885
2
- arvi/__init__.py,sha256=cECMjLbPiolmft2lsnNoszU6_1a-dKOVY8cb2D1CBfg,366
3
- arvi/ariadne_wrapper.py,sha256=jv8Wl35LfHl1UH1EklbvxHcQHqaEDhRGNogSYjFt7Y4,2141
4
- arvi/binning.py,sha256=G1nZvH2ev02quDPZCReygLkH7tX6B3hFAOoOYTfhLec,15249
5
- arvi/config.py,sha256=7ZoKzTwhIrlueYV1OF3q_iirAdZC0WheFUmXhl9wR4s,232
6
- arvi/dace_wrapper.py,sha256=CSq21VDt5n_Ln_A6jvxLVwo2TS25C_M00MfvH38uA8I,10621
7
- arvi/extra_data.py,sha256=WEEaYeLh52Zdv0uyHO72Ys5MWS3naTAP4wJV2BJ1mbk,2551
8
- arvi/gaia_wrapper.py,sha256=dv-uKWIsHbW-CPI14Fn1xIngsZrV7YBROVamgH0SULc,3418
9
- arvi/instrument_specific.py,sha256=gDNu6xM0nL3AItAxipTdg3dIGaGGi7tNWE5nnad5MxM,2873
10
- arvi/lbl_wrapper.py,sha256=_ViGVkpakvuBR_xhu9XJRV5EKHpj5Go6jBZGJZMIS2Y,11850
11
- arvi/nasaexo_wrapper.py,sha256=xrdF4KKXmlZAqu4IQtdcqfOeUXJXoui5M-eZpnVXNlk,7311
12
- arvi/plots.py,sha256=J1FR-7NgWL0zdjtD0Sumj6ZHLXSRC_EtnpXkTguxQ-s,17549
13
- arvi/programs.py,sha256=WpFE2cXYG-4ax2xmih0fFhvQbcVhnOEofVcwjePNmKQ,4505
14
- arvi/reports.py,sha256=yrdajC-zz5_kH1Ucc6cU70DK-5dpG0Xyeru-EITKpNo,3355
15
- arvi/setup_logger.py,sha256=pBzaRTn0hntozjbaRVx0JIbWGuENkvYUApa6uB-FsRo,279
16
- arvi/simbad_wrapper.py,sha256=7sqaVHDKtqLDxhcTzoa0EUcOAPGLEtoqkZz_XQS9eKw,5504
17
- arvi/stats.py,sha256=MQiyLvdiAFxIC29uajTy8kuxD-b2Y6mraL4AfWkRJkM,2576
18
- arvi/timeseries.py,sha256=LjMiht2LVi17s40aBTrNznANKpKfBxQ7b8uoi_vdZ8A,54371
19
- arvi/translations.py,sha256=AljjMsHRqzfcirdeavHsyVJFLvwKrM1wDLMv2RApG58,446
20
- arvi/utils.py,sha256=ay3GouZYqn66zF43KgSs8Ngsfb4YInKZEmk70YqVDoA,3676
21
- arvi/data/info.svg,sha256=0IMI6W-eFoTD8acnury79WJJakpBwLa4qKS4JWpsXiI,489
22
- arvi/data/obs_affected_ADC_issues.dat,sha256=pbwzvRBjS8KsLrKi1Cdgfihvo3hK3FUN8Csdysw-vAw,10653
23
- arvi/data/obs_affected_blue_cryostat_issues.dat,sha256=z4AK17xfz8tGTDv1FjRvQFnio4XA6PNNfDXuicewHk4,1771
24
- arvi/data/extra/HD86226_PFS1.rdb,sha256=vfAozbrKHM_j8dYkCBJsuHyD01KEM1asghe2KInwVao,3475
25
- arvi/data/extra/HD86226_PFS2.rdb,sha256=F2P7dB6gVyzCglUjNheB0hIHVClC5RmARrGwbrY1cfo,4114
26
- arvi/data/extra/metadata.json,sha256=C69hIw6CohyES6BI9vDWjxwSz7N4VOYX0PCgjXtYFmU,178
27
- arvi-0.1.12.dist-info/LICENSE,sha256=6JfQgl7SpM55t0EHMFNMnNh-AdkpGW25MwMiTnhdWQg,1068
28
- arvi-0.1.12.dist-info/METADATA,sha256=ZYHmuqlbt45XyTKJO4_Jzwi4rM2-K_t0ty6dvnNJOBc,1306
29
- arvi-0.1.12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
30
- arvi-0.1.12.dist-info/top_level.txt,sha256=4EeiKDVLD45ztuflTGfQ3TU8GVjJg5Y95xS5XjI-utU,5
31
- arvi-0.1.12.dist-info/RECORD,,
File without changes