spacr 0.1.55__py3-none-any.whl → 0.1.62__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.
spacr/gui_wrappers.py ADDED
@@ -0,0 +1,137 @@
1
+ import traceback, matplotlib, spacr
2
+ import matplotlib.pyplot as plt
3
+ matplotlib.use('Agg')
4
+
5
+ fig_queue = None
6
+
7
+ def my_show():
8
+ """
9
+ Replacement for plt.show() that queues figures instead of displaying them.
10
+ """
11
+ fig = plt.gcf()
12
+ fig_queue.put(fig)
13
+ plt.close(fig)
14
+
15
+ def measure_crop_wrapper(settings, q, fig_queue):
16
+ """
17
+ Wraps the measure_crop function to integrate with GUI processes.
18
+
19
+ Parameters:
20
+ - settings: dict, The settings for the measure_crop function.
21
+ - q: multiprocessing.Queue, Queue for logging messages to the GUI.
22
+ - fig_queue: multiprocessing.Queue, Queue for sending figures to the GUI.
23
+ """
24
+
25
+ # Temporarily override plt.show
26
+ original_show = plt.show
27
+ plt.show = my_show
28
+
29
+ try:
30
+ print('start')
31
+ spacr.measure.measure_crop(settings=settings)
32
+ except Exception as e:
33
+ errorMessage = f"Error during processing: {e}"
34
+ q.put(errorMessage)
35
+ traceback.print_exc()
36
+ finally:
37
+ plt.show = original_show
38
+
39
+ def preprocess_generate_masks_wrapper(settings, q, fig_queue):
40
+ """
41
+ Wraps the measure_crop function to integrate with GUI processes.
42
+
43
+ Parameters:
44
+ - settings: dict, The settings for the measure_crop function.
45
+ - q: multiprocessing.Queue, Queue for logging messages to the GUI.
46
+ - fig_queue: multiprocessing.Queue, Queue for sending figures to the GUI.
47
+ """
48
+
49
+ # Temporarily override plt.show
50
+ original_show = plt.show
51
+ plt.show = my_show
52
+
53
+ try:
54
+ spacr.core.preprocess_generate_masks(src=settings['src'], settings=settings)
55
+ except Exception as e:
56
+ errorMessage = f"Error during processing: {e}"
57
+ q.put(errorMessage)
58
+ traceback.print_exc()
59
+ finally:
60
+ plt.show = original_show
61
+
62
+ def sequencing_wrapper(settings, q, fig_queue):
63
+
64
+ # Temporarily override plt.show
65
+ original_show = plt.show
66
+ plt.show = my_show
67
+
68
+ try:
69
+ spacr.sequencing.analyze_reads(settings=settings)
70
+ except Exception as e:
71
+ errorMessage = f"Error during processing: {e}"
72
+ q.put(errorMessage)
73
+ traceback.print_exc()
74
+ finally:
75
+ plt.show = original_show
76
+
77
+ def umap_wrapper(settings, q, fig_queue):
78
+
79
+ # Temporarily override plt.show
80
+ original_show = plt.show
81
+ plt.show = my_show
82
+
83
+ try:
84
+ spacr.core.generate_image_umap(settings=settings)
85
+ except Exception as e:
86
+ errorMessage = f"Error during processing: {e}"
87
+ q.put(errorMessage)
88
+ traceback.print_exc()
89
+ finally:
90
+ plt.show = original_show
91
+
92
+ def train_test_model_wrapper(settings, q, fig_queue):
93
+ """
94
+ Wraps the measure_crop function to integrate with GUI processes.
95
+
96
+ Parameters:
97
+ - settings: dict, The settings for the measure_crop function.
98
+ - q: multiprocessing.Queue, Queue for logging messages to the GUI.
99
+ - fig_queue: multiprocessing.Queue, Queue for sending figures to the GUI.
100
+ """
101
+
102
+ # Temporarily override plt.show
103
+ original_show = plt.show
104
+ plt.show = my_show
105
+
106
+ try:
107
+ spacr.core.train_test_model(settings['src'], settings=settings)
108
+ except Exception as e:
109
+ errorMessage = f"Error during processing: {e}"
110
+ q.put(errorMessage) # Send the error message to the GUI via the queue
111
+ traceback.print_exc()
112
+ finally:
113
+ plt.show = original_show # Restore the original plt.show function
114
+
115
+
116
+ def run_multiple_simulations_wrapper(settings, q, fig_queue):
117
+ """
118
+ Wraps the run_multiple_simulations function to integrate with GUI processes.
119
+
120
+ Parameters:
121
+ - settings: dict, The settings for the run_multiple_simulations function.
122
+ - q: multiprocessing.Queue, Queue for logging messages to the GUI.
123
+ - fig_queue: multiprocessing.Queue, Queue for sending figures to the GUI.
124
+ """
125
+
126
+ # Temporarily override plt.show
127
+ original_show = plt.show
128
+ plt.show = my_show
129
+
130
+ try:
131
+ spacr.sim.run_multiple_simulations(settings=settings)
132
+ except Exception as e:
133
+ errorMessage = f"Error during processing: {e}"
134
+ q.put(errorMessage) # Send the error message to the GUI via the queue
135
+ traceback.print_exc()
136
+ finally:
137
+ plt.show = original_show # Restore the original plt.show function
spacr/measure.py CHANGED
@@ -16,12 +16,6 @@ from skimage.util import img_as_bool
16
16
 
17
17
  from .logger import log_function_call
18
18
 
19
- #from .io import create_database, _save_settings_to_db
20
- #from .timelapse import _timelapse_masks_to_gif, _scmovie
21
- #from .plot import _plot_cropped_arrays, _save_scimg_plot
22
- #from .utils import _merge_overlapping_objects, _filter_object, _relabel_parent_with_child_labels, _exclude_objects
23
- #from .utils import _merge_and_save_to_database, _crop_center, _find_bounding_box, _generate_names, _get_percentiles, normalize_to_dtype, _map_wells_png, _list_endpoint_subdirectories, _generate_representative_images
24
-
25
19
  def get_components(cell_mask, nucleus_mask, pathogen_mask):
26
20
  """
27
21
  Get the components (nucleus and pathogens) for each cell in the given masks.
@@ -626,8 +620,13 @@ def _measure_crop_core(index, time_ls, file, settings):
626
620
 
627
621
  file_name = os.path.splitext(file)[0]
628
622
  data = np.load(os.path.join(settings['input_folder'], file))
629
-
630
623
  data_type = data.dtype
624
+ if data_type not in ['uint8','uint16']:
625
+ data_type_before = data_type
626
+ data = data.astype(np.uint16)
627
+ data_type = data.dtype
628
+ print(f'Converted data from {data_type_before} to {data_type}')
629
+
631
630
  if settings['save_measurements']:
632
631
  os.makedirs(source_folder+'/measurements', exist_ok=True)
633
632
  _create_database(source_folder+'/measurements/measurements.db')
@@ -832,7 +831,6 @@ def _measure_crop_core(index, time_ls, file, settings):
832
831
  png_channels = normalize_to_dtype(png_channels, settings['normalize'][0], settings['normalize'][1], percentile_list=percentile_list)
833
832
  else:
834
833
  png_channels = normalize_to_dtype(png_channels, 0, 100)
835
-
836
834
  os.makedirs(png_folder, exist_ok=True)
837
835
 
838
836
  if png_channels.shape[2] == 2:
spacr/plot.py CHANGED
@@ -1565,4 +1565,56 @@ def plot_feature_importance(feature_importance_df):
1565
1565
  ax.set_xlabel('Feature Importance', fontsize=font_size)
1566
1566
  ax.tick_params(axis='both', which='major', labelsize=font_size)
1567
1567
  plt.tight_layout()
1568
- return fig
1568
+ return fig
1569
+
1570
+ def read_and_plot__vision_results(base_dir, y_axis='accuracy', name_split='_time', y_lim=[0.8, 0.9]):
1571
+ # List to store data from all CSV files
1572
+ data_frames = []
1573
+
1574
+ dst = os.path.join(base_dir, 'result')
1575
+ os.mkdir(dst,exists=True)
1576
+
1577
+ # Walk through the directory
1578
+ for root, dirs, files in os.walk(base_dir):
1579
+ for file in files:
1580
+ if file.endswith("_test_result.csv"):
1581
+ file_path = os.path.join(root, file)
1582
+ # Extract model information from the file name
1583
+ file_name = os.path.basename(file_path)
1584
+ model = file_name.split(f'{name_split}')[0]
1585
+
1586
+ # Extract epoch information from the file name
1587
+ epoch_info = file_name.split('_time')[1]
1588
+ base_folder = os.path.dirname(file_path)
1589
+ epoch = os.path.basename(base_folder)
1590
+
1591
+ # Read the CSV file
1592
+ df = pd.read_csv(file_path)
1593
+ df['model'] = model
1594
+ df['epoch'] = epoch
1595
+
1596
+ # Append the data frame to the list
1597
+ data_frames.append(df)
1598
+
1599
+ # Concatenate all data frames
1600
+ if data_frames:
1601
+ result_df = pd.concat(data_frames, ignore_index=True)
1602
+
1603
+ # Calculate average y_axis per model
1604
+ avg_metric = result_df.groupby('model')[y_axis].mean().reset_index()
1605
+ avg_metric = avg_metric.sort_values(by=y_axis)
1606
+ print(avg_metric)
1607
+
1608
+ # Plotting the results
1609
+ plt.figure(figsize=(10, 6))
1610
+ plt.bar(avg_metric['model'], avg_metric[y_axis])
1611
+ plt.xlabel('Model')
1612
+ plt.ylabel(f'{y_axis}')
1613
+ plt.title(f'Average {y_axis.capitalize()} per Model')
1614
+ plt.xticks(rotation=45)
1615
+ plt.tight_layout()
1616
+ if y_lim is not None:
1617
+ plt.ylim(y_lim)
1618
+ plt.show()
1619
+ else:
1620
+ print("No CSV files found in the specified directory.")
spacr/settings.py CHANGED
@@ -795,7 +795,8 @@ def check_settings(vars_dict):
795
795
  return settings
796
796
 
797
797
  def generate_fields(variables, scrollable_frame):
798
- from .gui_utils import create_input_field, spacrToolTip
798
+ from .gui_utils import create_input_field
799
+ from .gui_elements import spacrToolTip
799
800
  row = 1
800
801
  vars_dict = {}
801
802
  tooltips = {
spacr/utils.py CHANGED
@@ -1,4 +1,4 @@
1
- import sys, os, re, sqlite3, torch, torchvision, random, string, shutil, cv2, tarfile, glob
1
+ import sys, os, re, sqlite3, torch, torchvision, random, string, shutil, cv2, tarfile, glob, psutil, platform, signal
2
2
 
3
3
  import numpy as np
4
4
  from cellpose import models as cp_models
@@ -72,13 +72,12 @@ from sklearn.cluster import KMeans
72
72
  from scipy import stats
73
73
 
74
74
  from .logger import log_function_call
75
-
76
- import os
77
- import signal
78
- import psutil
79
- import platform
80
75
  from multiprocessing import set_start_method, get_start_method
81
76
 
77
+ import tkinter as tk
78
+ from tkinter import ttk
79
+ import tkinter.font as tkFont
80
+
82
81
  def reset_mp():
83
82
  current_method = get_start_method()
84
83
  system = platform.system()
@@ -473,7 +472,7 @@ def is_list_of_lists(var):
473
472
  return True
474
473
  return False
475
474
 
476
- def normalize_to_dtype(array, p1=2, p2=98, percentile_list=None):
475
+ def normalize_to_dtype(array, p1=2, p2=98, percentile_list=None, new_dtype=None):
477
476
  """
478
477
  Normalize each image in the stack to its own percentiles.
479
478
 
@@ -492,7 +491,16 @@ def normalize_to_dtype(array, p1=2, p2=98, percentile_list=None):
492
491
  The normalized stack with the same shape as the input stack.
493
492
  """
494
493
 
495
- out_range = (0, np.iinfo(array.dtype).max)
494
+ if new_dtype is None:
495
+ out_range = (0, np.iinfo(array.dtype).max)
496
+ elif new_dtype in [np.uint8, np.uint16]:
497
+ out_range = (0, np.iinfo(new_dtype).max)
498
+ elif new_dtype in ['uint8', 'uint16']:
499
+ new_dtype = np.uint8 if new_dtype == 'uint8' else np.uint16
500
+ out_range = (0, np.iinfo(new_dtype).max)
501
+ else:
502
+ out_range = (0, np.iinfo(array.dtype).max)
503
+
496
504
  nimg = array.shape[2]
497
505
  new_stack = np.empty_like(array, dtype=array.dtype)
498
506
 
@@ -4051,7 +4059,7 @@ def _merge_cells_based_on_parasite_overlap(parasite_mask, cell_mask, nuclei_mask
4051
4059
 
4052
4060
  # Relabel the merged cell mask
4053
4061
  relabeled_cell_mask, _ = label(cell_mask, return_num=True)
4054
- return relabeled_cell_mask
4062
+ return relabeled_cell_mask.astype(np.uint16)
4055
4063
 
4056
4064
  def adjust_cell_masks(parasite_folder, cell_folder, nuclei_folder, overlap_threshold=5, perimeter_threshold=30):
4057
4065
 
@@ -4091,7 +4099,7 @@ def adjust_cell_masks(parasite_folder, cell_folder, nuclei_folder, overlap_thres
4091
4099
  merged_cell_mask = _merge_cells_based_on_parasite_overlap(parasite_mask, cell_mask, nuclei_mask, overlap_threshold, perimeter_threshold)
4092
4100
 
4093
4101
  # Force 16 bit
4094
- mamerged_cell_masksk = merged_cell_mask.astype(np.uint16)
4102
+ #merged_cell_mask = merged_cell_mask.astype(np.uint16)
4095
4103
 
4096
4104
  # Overwrite the original cell mask file with the merged result
4097
4105
  np.save(cell_path, merged_cell_mask)
@@ -4383,4 +4391,4 @@ def correct_masks(src):
4383
4391
 
4384
4392
  cell_path = os.path.join(src,'norm_channel_stack', 'cell_mask_stack')
4385
4393
  convert_and_relabel_masks(cell_path)
4386
- _load_and_concatenate_arrays(src, [0,1,2,3], 1, 0, 2)
4394
+ _load_and_concatenate_arrays(src, [0,1,2,3], 1, 0, 2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.1.55
3
+ Version: 0.1.62
4
4
  Summary: Spatial phenotype analysis of crisp screens (SpaCr)
5
5
  Home-page: https://github.com/EinarOlafsson/spacr
6
6
  Author: Einar Birnir Olafsson
@@ -1,11 +1,11 @@
1
- spacr/__init__.py,sha256=cHMZ6CcoOfm_3igLgndH3hxDbW8kBx5pqM04zEtlg3w,1339
1
+ spacr/__init__.py,sha256=8uhfJ_RcnX4OmvflNRcts4zxnyfML6xiyIeFGZeMpXg,1416
2
2
  spacr/__main__.py,sha256=bkAJJD2kjIqOP-u1kLvct9jQQCeUXzlEjdgitwi1Lm8,75
3
3
  spacr/alpha.py,sha256=Y95sLEfpK2OSYKRn3M8eUOU33JJeXfV8zhrC4KnwSTY,35244
4
4
  spacr/annotate_app.py,sha256=imQ7ZEXDyM6ce1dxZ1xUS1-KequuF_NCI4xCaPLjvco,29275
5
5
  spacr/annotate_app_v2.py,sha256=imQ7ZEXDyM6ce1dxZ1xUS1-KequuF_NCI4xCaPLjvco,29275
6
- spacr/app_annotate.py,sha256=lnjVLwzwpZ9-5cHuEgCmAC-pAnGQmmWyjTXDF0NV2Ps,23560
6
+ spacr/app_annotate.py,sha256=QKWQ0GGiKu5ik14OB4Z3YIqIJYpmsNJlqpnfnQPowAM,23563
7
7
  spacr/app_classify.py,sha256=urTP_wlZ58hSyM5a19slYlBxN0PdC-9-ga0hvq8CGWc,165
8
- spacr/app_make_masks.py,sha256=0qbZhCnWzqJAhRGCI4j7GdJx8mEBA8j7LxGjWlQHyss,45060
8
+ spacr/app_make_masks.py,sha256=0N8Wfby3HaVX4m9tOyBy7OQolamYG9lVwmnlzkK4uaE,44993
9
9
  spacr/app_make_masks_v2.py,sha256=OkNeskNbgep8wQa4ES3jpJjZLfn4yIkGwQOd9r0spfA,30497
10
10
  spacr/app_mask.py,sha256=l-dBY8ftzCMdDe6-pXc2Nh_u-idNL9G7UOARiLJBtds,153
11
11
  spacr/app_measure.py,sha256=_K7APYIeOKpV6e_LcqabBjvEi7mfq9Fch8175x1x0k8,162
@@ -14,43 +14,47 @@ spacr/app_umap.py,sha256=ZWAmf_OsIKbYvolYuWPMYhdlVe-n2CADoJulAizMiEo,153
14
14
  spacr/chris.py,sha256=YlBjSgeZaY8HPy6jkrT_ISAnCMAKVfvCxF0I9eAZLFM,2418
15
15
  spacr/classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
16
16
  spacr/cli.py,sha256=507jfOOEV8BoL4eeUcblvH-iiDHdBrEVJLu1ghAAPSc,1800
17
- spacr/core.py,sha256=S44olGF8qveg6uBCRDuCP4FZ5dXXVwSfeImolTpQIAs,160372
17
+ spacr/core.py,sha256=JZ8LerUgXarhCQWsUlBD6KULhsIBDlpvotZCSwRt1rI,160317
18
18
  spacr/deep_spacr.py,sha256=rvqOoY9dadcTcKiABf61Nb8HEMVp1NouFmtAE2ee1T4,37056
19
19
  spacr/foldseek.py,sha256=YIP1d4Ci6CeA9jSyiv-HTDbNmAmcSM9Y_DaOs7wYzLY,33546
20
20
  spacr/get_alfafold_structures.py,sha256=ehx_MQgb12k3hFecP6cYVlm5TLO8iWjgevy8ESyS3cw,3544
21
21
  spacr/graph_learning.py,sha256=1tR-ZxvXE3dBz1Saw7BeVFcrsUFu9OlUZeZVifih9eo,13070
22
- spacr/gui.py,sha256=awunZePAu-LH-rPEUhxVTAXXkG5L8oyHz-qHcEX6Im4,7765
22
+ spacr/gui.py,sha256=kvQ0X9nyZz_BWsOyJSNSv7gEG1ZuTqjz4EH78e0uul4,7783
23
23
  spacr/gui_2.py,sha256=ZAI5quQYbhQJ40vK0NCqU_UMSPLkpfeQpomBWUSM0fc,6946
24
24
  spacr/gui_annotate.py,sha256=ugBksLGOHdtOLlEuRyyc59TrkYKu3rDf8JxEgiBSVao,6536
25
25
  spacr/gui_classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
26
+ spacr/gui_core.py,sha256=itgdS6bokEi2ouRMTKjB6T3TnMyUaAPHNTscAEsq4jE,28401
27
+ spacr/gui_elements.py,sha256=WoDrxZg8bzIw5G-WsXG4ek-62cMsU6z0zyn_1P9CX7E,15063
26
28
  spacr/gui_make_masks_app.py,sha256=tl4M4Q2WQgrrwjRBJVevxJxpNowqzPhWkdCOm2UfRbw,45053
27
29
  spacr/gui_make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
28
30
  spacr/gui_mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
29
31
  spacr/gui_measure_app.py,sha256=_C1-XFL5HSquUEEbM_NcxdvHx-socPFCx85MBG4d6xo,10598
32
+ spacr/gui_run.py,sha256=0x85MJqFtREuWuNeIRLB8hFeibKGszfN14POQQWzPDQ,1998
30
33
  spacr/gui_sim_app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- spacr/gui_utils.py,sha256=8joqzUdN_26VeI2Gsd0Tjh_ArAFzjE323VGSHDJnev4,51624
34
+ spacr/gui_utils.py,sha256=sDPmdXonIiCkXm2NBH_Tghf05_2PPV-ltWY8YCgzOzA,5441
35
+ spacr/gui_wrappers.py,sha256=OBSArqRrM0neEOz44Z_YVceISLqY6WverrVm60GCgqo,4248
32
36
  spacr/io.py,sha256=IoERqSwoxJrInYl-E0WfwFOEDZXFdJofk5DmpbyLGWM,112077
33
37
  spacr/logger.py,sha256=7Zqr3TuuOQLWT32gYr2q1qvv7x0a2JhLANmZcnBXAW8,670
34
38
  spacr/make_masks_app.py,sha256=iGaTwhowoe2JMOSOf8bJwQZTooRhLQx7KO0ewnAmqDY,45138
35
39
  spacr/make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
36
40
  spacr/mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
37
- spacr/measure.py,sha256=r5nxxULUyka2L5IVdnmEmnMywChY3a4DWGse3ygIh4Q,56000
41
+ spacr/measure.py,sha256=C8el2DFz1xMa8_V5xU2q5QHs-aZzfCniI-ylcY5RYSI,55736
38
42
  spacr/measure_app.py,sha256=_C1-XFL5HSquUEEbM_NcxdvHx-socPFCx85MBG4d6xo,10598
39
43
  spacr/old_code.py,sha256=jw67DAGoLBd7mWofVzRJSEmCI1Qrff26zIo65SEkV00,13817
40
- spacr/plot.py,sha256=lrwU51OTWfby1wx73XGyjYmTjLVia7WOmGH5LZZ-4jM,67145
44
+ spacr/plot.py,sha256=DYJEoK1kz2ih6ZGvKiA3xTqeIeKQNhuQKwgrscopFxA,69101
41
45
  spacr/sequencing.py,sha256=fHZRnoMSxmhMdadkei3lUeBdckqFyptWdQyWsDW3aaU,83304
42
- spacr/settings.py,sha256=1tcgdn4RWbX7_Qto0nHDP_f202sT7d_9-UU_W-q8cPc,45639
46
+ spacr/settings.py,sha256=Yp4VlkmZLuklSbAf3kiIm7iNTWpy2tJuhLNmLUqvFeM,45668
43
47
  spacr/sim.py,sha256=FveaVgBi3eypO2oVB5Dx-v0CC1Ny7UPfXkJiiRRodAk,71212
44
48
  spacr/sim_app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
49
  spacr/timelapse.py,sha256=KMYCgHzf9LTZe-lWl5mvH2EjbKRE6OhpwdY13wEumGc,39504
46
- spacr/utils.py,sha256=MM31yWquNDFmhxAU3l3Qx64peQJ6VWOuNGS6gkia5AY,186541
50
+ spacr/utils.py,sha256=149Bbha9OXAKyDwABgHz5h4O7Gqy6aeFLA1pMSq311s,186966
47
51
  spacr/version.py,sha256=axH5tnGwtgSnJHb5IDhiu4Zjk5GhLyAEDRe-rnaoFOA,409
48
52
  spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model,sha256=z8BbHWZPRnE9D_BHO0fBREE85c1vkltDs-incs2ytXQ,26566572
49
53
  spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model_settings.csv,sha256=fBAGuL_B8ERVdVizO3BHozTDSbZUh1yFzsYK3wkQN68,420
50
54
  spacr/models/cp/toxo_pv_lumen.CP_model,sha256=2y_CindYhmTvVwBH39SNILF3rI3x9SsRn6qrMxHy3l0,26562451
51
- spacr-0.1.55.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
52
- spacr-0.1.55.dist-info/METADATA,sha256=uTrkXO1JPmHgXWuuZJzsd8LQCWkoY0qrIBfkMGymzQE,5050
53
- spacr-0.1.55.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
54
- spacr-0.1.55.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
55
- spacr-0.1.55.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
56
- spacr-0.1.55.dist-info/RECORD,,
55
+ spacr-0.1.62.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
56
+ spacr-0.1.62.dist-info/METADATA,sha256=6K_4R8rwrnkEisgBNA6iy3Wm-vweiOVtYUrkJb9VhiY,5050
57
+ spacr-0.1.62.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
58
+ spacr-0.1.62.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
59
+ spacr-0.1.62.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
60
+ spacr-0.1.62.dist-info/RECORD,,
File without changes