spacr 0.3.32__py3-none-any.whl → 0.3.33__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/plot.py CHANGED
@@ -2103,7 +2103,7 @@ class spacrGraph:
2103
2103
  """
2104
2104
  self.df = df
2105
2105
  self.grouping_column = grouping_column
2106
- self.data_column = data_column
2106
+ self.data_column = data_column if isinstance(data_column, list) else [data_column]
2107
2107
  self.graph_type = graph_type
2108
2108
  self.summary_func = summary_func
2109
2109
  self.order = order
@@ -2148,7 +2148,8 @@ class spacrGraph:
2148
2148
 
2149
2149
  def preprocess_data(self):
2150
2150
  """Preprocess the data: remove NaNs, sort/order the grouping column, and optionally group by 'prc'."""
2151
- df = self.df.dropna(subset=[self.grouping_column, self.data_column])
2151
+ # Remove NaNs in both the grouping column and each data column
2152
+ df = self.df.dropna(subset=[self.grouping_column] + self.data_column) # Handle multiple data columns
2152
2153
 
2153
2154
  # Group by 'prc' column if representation is 'well'
2154
2155
  if self.representation == 'well':
@@ -2158,9 +2159,10 @@ class spacrGraph:
2158
2159
  df[self.grouping_column] = pd.Categorical(df[self.grouping_column], categories=self.order, ordered=True)
2159
2160
  else:
2160
2161
  df[self.grouping_column] = pd.Categorical(df[self.grouping_column], categories=sorted(df[self.grouping_column].unique()), ordered=True)
2161
-
2162
+
2162
2163
  return df
2163
2164
 
2165
+
2164
2166
  def remove_outliers_from_plot(self):
2165
2167
  """Remove outliers from the plot but keep them in the data."""
2166
2168
  filtered_df = self.df.copy()
@@ -2176,26 +2178,28 @@ class spacrGraph:
2176
2178
  return filtered_df
2177
2179
 
2178
2180
  def perform_normality_tests(self):
2179
- """Perform normality tests for each group."""
2181
+ """Perform normality tests for each group and each data column."""
2180
2182
  unique_groups = self.df[self.grouping_column].unique()
2181
- grouped_data = [self.df.loc[self.df[self.grouping_column] == group, self.data_column] for group in unique_groups]
2182
- raw_grouped_data = [self.raw_df.loc[self.raw_df[self.grouping_column] == group, self.data_column] for group in unique_groups]
2183
-
2184
- normal_p_values = [normaltest(data).pvalue for data in grouped_data]
2185
- normal_stats = [normaltest(data).statistic for data in grouped_data]
2186
- is_normal = all(p > 0.05 for p in normal_p_values)
2183
+ normality_results = []
2184
+
2185
+ for column in self.data_column:
2186
+ grouped_data = [self.df.loc[self.df[self.grouping_column] == group, column] for group in unique_groups]
2187
+ normal_p_values = [normaltest(data).pvalue for data in grouped_data]
2188
+ normal_stats = [normaltest(data).statistic for data in grouped_data]
2189
+ is_normal = all(p > 0.05 for p in normal_p_values) # Test if all groups are normal
2190
+
2191
+ for group, stat, p_value in zip(unique_groups, normal_stats, normal_p_values):
2192
+ normality_results.append({
2193
+ 'Comparison': f'Normality test for {group} on {column}',
2194
+ 'Test Statistic': stat,
2195
+ 'p-value': p_value,
2196
+ 'Test Name': 'Normality test',
2197
+ 'Column': column,
2198
+ 'n': len(self.df[self.df[self.grouping_column] == group]) # Sample size
2199
+ })
2200
+
2201
+ return is_normal, normality_results
2187
2202
 
2188
- test_results = []
2189
- for group, stat, p_value in zip(unique_groups, normal_stats, normal_p_values):
2190
- test_results.append({
2191
- 'Comparison': f'Normality test for {group}',
2192
- 'Test Statistic': stat,
2193
- 'p-value': p_value,
2194
- 'Test Name': 'Normality test',
2195
- 'n_object': len(raw_grouped_data[unique_groups.tolist().index(group)]), # Raw sample size (objects/cells)
2196
- 'n_well': len(grouped_data[unique_groups.tolist().index(group)]) if self.representation == 'well' else np.nan # Summarized size (wells)
2197
- })
2198
- return is_normal, test_results
2199
2203
 
2200
2204
  def perform_levene_test(self, unique_groups):
2201
2205
  """Perform Levene's test for equal variance."""
@@ -2294,83 +2298,117 @@ class spacrGraph:
2294
2298
  if self.remove_outliers:
2295
2299
  self.df = self.remove_outliers_from_plot()
2296
2300
 
2297
- # Perform normality tests
2298
- is_normal, normality_results = self.perform_normality_tests()
2299
-
2300
- # Perform Levene's test for equal variance
2301
+ # Get the unique groups from the grouping column
2301
2302
  unique_groups = self.df[self.grouping_column].unique()
2302
- levene_stat, levene_p = self.perform_levene_test(unique_groups)
2303
- levene_result = {
2304
- 'Comparison': 'Levene’s test for equal variance',
2305
- 'Test Statistic': levene_stat,
2306
- 'p-value': levene_p,
2307
- 'Test Name': 'Levene’s Test'
2308
- }
2309
-
2310
- # Perform statistical tests
2311
- stat_results = self.perform_statistical_tests(unique_groups, is_normal)
2312
-
2313
- # Perform post-hoc tests if applicable
2314
- posthoc_results = self.perform_posthoc_tests(is_normal, unique_groups)
2315
-
2316
- # Combine all test results
2317
- self.results_df = pd.DataFrame(normality_results + [levene_result] + stat_results + posthoc_results)
2318
-
2319
- # Add sample size column
2320
- sample_sizes = self.df.groupby(self.grouping_column)[self.data_column].count().reset_index(name='n')
2321
- self.results_df['n'] = self.results_df['Comparison'].apply(
2322
- lambda x: next((sample_sizes[sample_sizes[self.grouping_column] == g]['n'].values[0] for g in sample_sizes[self.grouping_column] if g in x), np.nan)
2323
- )
2324
2303
 
2325
- # Dynamically set figure dimensions based on the number of unique groups
2326
- num_groups = len(unique_groups)
2327
- bar_width = 0.6 # Set the desired thickness of each bar
2328
- spacing_between_groups = 0.3 # Set the desired spacing between bars and axis
2304
+ # Flatten the DataFrame to handle multiple `data_column` values in a single plot
2305
+ self.df_melted = pd.melt(self.df, id_vars=[self.grouping_column], value_vars=self.data_column,
2306
+ var_name='Data Column', value_name='Value')
2307
+
2308
+ # Dynamically set figure dimensions based on the number of unique groups and data columns
2309
+ num_groups = len(self.df_melted[self.grouping_column].unique())
2310
+ num_data_columns = len(self.data_column)
2311
+ bar_width = 2.0 / num_data_columns
2312
+ spacing_between_groups = 0.1
2329
2313
 
2330
- fig_width = num_groups * (bar_width + spacing_between_groups) # Dynamically calculate the figure width
2331
- fig_height = 6 # Fixed height for the plot
2314
+ fig_width = (num_groups * num_data_columns * bar_width) + (spacing_between_groups * num_groups)
2315
+ fig_height = 10
2332
2316
 
2333
2317
  if ax is None:
2334
- self.fig, ax = plt.subplots(figsize=(fig_width, fig_height)) # Store the figure in self.fig
2318
+ self.fig, ax = plt.subplots(figsize=(fig_width, fig_height))
2335
2319
  else:
2336
- self.fig = ax.figure # Store the figure if ax is provided
2337
-
2338
- sns.set(style="ticks")
2339
- color_palette = self.sns_palette if not self.colors else self.colors
2340
-
2341
- # Calculate x-axis limits to ensure equal space between the bars and the y-axis
2342
- xlim_lower = -0.5 # Ensures space between the y-axis and the first category
2343
- xlim_upper = num_groups - 0.5 # Ensures space after the last category
2344
- ax.set_xlim(xlim_lower, xlim_upper)
2345
-
2346
- if self.summary_func is None:
2347
- sns.stripplot(x=self.grouping_column, y=self.data_column, data=self.df, palette=color_palette, jitter=True, alpha=0.6, ax=ax)
2348
- elif self.graph_type == 'bar':
2320
+ self.fig = ax.figure
2321
+
2322
+ if len(self.data_column) == 1:
2323
+ self.hue=self.grouping_column
2324
+ self.jitter_bar_dodge = False
2325
+ else:
2326
+ self.hue='Data Column'
2327
+ self.jitter_bar_dodge = True
2328
+
2329
+ # Handle the different plot types based on `graph_type`
2330
+ if self.graph_type == 'bar':
2349
2331
  self._create_bar_plot(bar_width, ax)
2332
+ elif self.graph_type == 'jitter':
2333
+ #transparent_palette = [(r, g, b, 0.6) for (r, g, b) in sns.color_palette(self.sns_palette, n_colors=len(df_melted[hue].unique()))]
2334
+ self._create_jitter_plot(ax)
2350
2335
  elif self.graph_type == 'box':
2351
2336
  self._create_box_plot(ax)
2352
2337
  elif self.graph_type == 'violin':
2353
2338
  self._create_violin_plot(ax)
2354
- elif self.graph_type == 'jitter':
2355
- self._create_jitter_plot(ax)
2356
2339
  else:
2357
- raise ValueError(f"Invalid graph_type: {self.graph_type}. Choose from 'bar', 'box', 'violin', or 'jitter'.")
2340
+ raise ValueError(f"Unknown graph type: {self.graph_type}")
2341
+
2342
+ if ax is None:
2343
+ self.fig, ax = plt.subplots(figsize=(fig_width, fig_height))
2344
+ else:
2345
+ self.fig = ax.figure
2346
+
2358
2347
 
2359
2348
  # Set y-axis start
2360
2349
  if self.y_axis_start is not None:
2361
2350
  ax.set_ylim(bottom=self.y_axis_start)
2362
2351
 
2363
- # Add ticks, remove grid, and save plot
2364
- ax.minorticks_on()
2365
- ax.tick_params(axis='x', which='minor', bottom=False) # Disable minor ticks on x-axis
2366
- ax.tick_params(axis='x', which='major', length=6, width=2, direction='out')
2367
- ax.tick_params(axis='y', which='major', length=6, width=2, direction='out')
2368
- ax.tick_params(axis='y', which='minor', length=4, width=1, direction='out')
2352
+ # Remove top and right spines
2369
2353
  sns.despine(ax=ax, top=True, right=True)
2370
2354
 
2355
+ # Adjust the position of the plot to move it closer to the table
2356
+ ax.set_position([0.1, 0.25, 0.8, 0.45]) # Adjust the height of the plot, leaving more space for the table
2357
+
2358
+ # Move the legend outside the plot
2359
+ ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), title='Data Column')
2360
+
2361
+ ax.set_xlabel('')
2362
+
2363
+ if len(self.data_column) == 1:
2364
+ ax.legend().remove()
2365
+ ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
2366
+
2367
+ # Create the grid with '+' and '-' symbols
2368
+ if len(self.data_column) > 1:
2369
+ ax.set_xticks([])
2370
+ ax.tick_params(bottom=False)
2371
+ ax.set_xticklabels([])
2372
+
2373
+ legend_ax = self.fig.add_axes([0.1, 0.02, 0.8, 0.2]) # Position the table closer to the graph
2374
+ legend_ax.set_axis_off()
2375
+
2376
+ # Prepare the rows and symbols
2377
+ row_labels = self.data_column
2378
+ table_data = []
2379
+
2380
+ # Ensure the rows for each data column match the number of unique bars
2381
+ for column in self.data_column:
2382
+ column_bars = []
2383
+ for group in unique_groups:
2384
+ # For each group and data column, assign a '+' or '-'
2385
+ for bar_position in range(num_data_columns): # Loop through each data_column position
2386
+ if bar_position == self.data_column.index(column):
2387
+ column_bars.append('+')
2388
+ else:
2389
+ column_bars.append('-')
2390
+ table_data.append(column_bars)
2391
+
2392
+ # Display the table directly below the graph with white background and thicker row height
2393
+ legend_table = legend_ax.table(cellText=table_data,
2394
+ rowLabels=row_labels,
2395
+ loc='center',
2396
+ cellLoc='center',
2397
+ rowColours=['white'] * len(row_labels), # Set background to white
2398
+ cellColours=[['white'] * len(column_bars) for _ in table_data], # White cell background
2399
+ edges='closed', # Show edges around cells
2400
+ bbox=[0, 0, 1, 1])
2401
+
2402
+ # Adjust the row height for readability
2403
+ for key, cell in legend_table.get_celld().items():
2404
+ cell.set_height(0.5) # Increase row height
2405
+ cell.set_edgecolor('white') # Set grid color to white
2406
+ cell.set_linewidth(2) # Set line thickness
2407
+
2371
2408
  if self.save:
2372
2409
  self._save_results()
2373
2410
 
2411
+ plt.tight_layout() # Ensure the layout is tight
2374
2412
  plt.show() # Ensure the plot is shown, but plt.show() doesn't clear the figure context
2375
2413
 
2376
2414
  def get_figure(self):
@@ -2379,31 +2417,74 @@ class spacrGraph:
2379
2417
 
2380
2418
  def _create_bar_plot(self, bar_width, ax):
2381
2419
  """Helper method to create a bar plot with consistent bar thickness and centered error bars."""
2382
- summary_df = self.df.groupby(self.grouping_column)[self.data_column].agg([self.summary_func, 'std', 'sem'])
2383
2420
 
2421
+ # Melt the dataframe for easier use with seaborn's hue functionality
2422
+ df_melted = pd.melt(self.df, id_vars=[self.grouping_column], value_vars=self.data_column,
2423
+ var_name='Data Column', value_name=self.summary_func)
2424
+
2425
+ # Group the melted DataFrame by grouping column and data column for error bars calculation
2426
+ summary_df = df_melted.groupby([self.grouping_column, 'Data Column']).agg({self.summary_func: ['mean', 'std', 'sem']}).reset_index()
2427
+ summary_df.columns = ['_'.join(col).strip() if isinstance(col, tuple) else col for col in summary_df.columns]
2428
+
2429
+ # Determine which type of error bars to show (std or sem)
2384
2430
  if self.error_bar_type == 'std':
2385
- error_bars = summary_df['std']
2431
+ error_bars = summary_df[f'{self.summary_func}_std']
2386
2432
  elif self.error_bar_type == 'sem':
2387
- error_bars = summary_df['sem']
2433
+ error_bars = summary_df[f'{self.summary_func}_sem']
2388
2434
  else:
2389
2435
  raise ValueError(f"Invalid error_bar_type: {self.error_bar_type}. Choose either 'std' or 'sem'.")
2390
2436
 
2391
- sns.barplot(x=self.grouping_column, y=self.summary_func, data=summary_df.reset_index(), ci=None, palette=self.sns_palette, width=bar_width, ax=ax)
2437
+ # Set the hue to 'Data Column' if there are multiple data columns
2438
+ hue = 'Data Column' if len(self.data_column) > 1 else None
2439
+
2440
+ # Create the bar plot with dodge=True to ensure bars for different data columns are side by side
2441
+ barplot = sns.barplot(
2442
+ data=df_melted,
2443
+ x=self.grouping_column,
2444
+ y=self.summary_func,
2445
+ hue=hue,
2446
+ palette=self.sns_palette,
2447
+ dodge=self.jitter_bar_dodge, # Ensure bars are separated
2448
+ ax=ax,
2449
+ ci=None # Disable Seaborn's internal error bars
2450
+ )
2451
+
2452
+ # Sort summary_df to match the order of bars in the plot
2453
+ summary_df_sorted = summary_df.sort_values([f'{self.grouping_column}_', 'Data Column_'])
2454
+
2455
+ # Get the positions of the bars
2456
+ bars = [patch for patch in ax.patches if isinstance(patch, plt.Rectangle)]
2457
+
2458
+ # Ensure error bars are aligned with correct bars
2459
+ for bar, (_, row) in zip(bars, summary_df_sorted.iterrows()):
2460
+ x_bar = bar.get_x() + bar.get_width() / 2 # Center of the bar
2461
+ err = row[f'{self.summary_func}_{self.error_bar_type}'] # Get the correct error value for this bar
2462
+
2463
+ ax.errorbar(x=x_bar, y=bar.get_height(), yerr=err, fmt='none', c='black', capsize=5, lw=2)
2464
+
2465
+ # Set the legend outside the plot
2466
+ if hue:
2467
+ ax.legend(title="Data Column", loc='center left', bbox_to_anchor=(1, 0.5))
2468
+ else:
2469
+ if len(self.data_column) > 1:
2470
+ ax.legend_.remove()
2471
+
2472
+ # Set labels
2473
+ ax.set_xlabel(self.grouping_column)
2474
+ ax.set_ylabel(self.summary_func)
2392
2475
 
2393
- # Plot the error bars
2394
- ax.errorbar(x=np.arange(len(summary_df)), y=summary_df[self.summary_func], yerr=error_bars, fmt='none', c='black', capsize=5)
2395
2476
 
2396
2477
  def _create_jitter_plot(self, ax):
2397
- """Helper method to create a jitter plot (strip plot)."""
2398
- sns.stripplot(x=self.grouping_column, y=self.data_column, data=self.df, palette=self.sns_palette, jitter=True, alpha=0.6, ax=ax)
2478
+ """Helper method to create a jitter plot (strip plot) for a specified column."""
2479
+ sns.stripplot(data=self.df_melted, x=self.grouping_column, y='Value', hue=self.hue, palette=self.sns_palette, dodge=self.jitter_bar_dodge, jitter=True, ax=ax, alpha=0.6)
2399
2480
 
2400
2481
  def _create_box_plot(self, ax):
2401
- """Helper method to create a box plot."""
2402
- sns.boxplot(x=self.grouping_column, y=self.data_column, data=self.df, palette=self.sns_palette, ax=ax)
2482
+ """Helper method to create a box plot for a specified column."""
2483
+ sns.boxplot(data=self.df_melted, x=self.grouping_column, y='Value', hue=self.hue, palette=self.sns_palette, ax=ax)
2403
2484
 
2404
2485
  def _create_violin_plot(self, ax):
2405
- """Helper method to create a violin plot."""
2406
- sns.violinplot(x=self.grouping_column, y=self.data_column, data=self.df, palette=self.sns_palette, ax=ax)
2486
+ """Helper method to create a violin plot for a specified column."""
2487
+ sns.violinplot(data=self.df_melted, x=self.grouping_column, y='Value', hue=self.hue, palette=self.sns_palette, ax=ax)
2407
2488
 
2408
2489
  def _save_results(self):
2409
2490
  """Helper method to save the plot and results."""
@@ -2417,4 +2498,62 @@ class spacrGraph:
2417
2498
 
2418
2499
  def get_results(self):
2419
2500
  """Return the results dataframe."""
2420
- return self.results_df
2501
+ return self.results_df
2502
+
2503
+ def plot_data_from_db(settings):
2504
+ from .io import _read_db
2505
+ from spacr.utils import annotate_conditions
2506
+ """
2507
+ Extracts the specified table from the SQLite database and plots a specified column.
2508
+
2509
+ Args:
2510
+ db_path (str): The path to the SQLite database.
2511
+ table_name (str): The name of the table to extract.
2512
+ column_name (str): The column to plot from the table.
2513
+
2514
+ Returns:
2515
+ df (pd.DataFrame): The extracted table as a DataFrame.
2516
+ """
2517
+
2518
+ db_loc = os.path.join(settings['src'], 'measurements',settings['database'])
2519
+
2520
+ [df] = _read_db(db_loc, tables=[settings['table_name']])
2521
+
2522
+ df = annotate_conditions(df,
2523
+ cells=settings['cell_types'],
2524
+ cell_loc=settings['cell_plate_metadata'],
2525
+ pathogens=settings['pathogen_types'],
2526
+ pathogen_loc=settings['pathogen_plate_metadata'],
2527
+ treatments=settings['treatments'],
2528
+ treatment_loc=settings['treatment_plate_metadata'])
2529
+
2530
+ df['prc'] = df['plate'].astype(str) + '_' + df['row'].astype(str) + '_' + df['col'].astype(str)
2531
+ df = df.dropna(subset=settings['column_name'])
2532
+ df['class'] = df['png_path'].apply(lambda x: 'class_1' if 'class_1' in x else ('class_0' if 'class_0' in x else None))
2533
+ #display(df)
2534
+ # Initialize the spacrGraph class with your DataFrame and desired parameters
2535
+ spacr_graph = spacrGraph(
2536
+ df=df, # Your DataFrame
2537
+ grouping_column=settings['grouping_column'], # Column for grouping the data (x-axis)
2538
+ data_column=settings['column_name'], # Column for the data (y-axis)
2539
+ graph_type=settings['graph_type'], # Type of plot ('bar', 'box', 'violin', 'jitter')
2540
+ summary_func='mean', # Function to summarize data (e.g., 'mean', 'median')
2541
+ colors=None, # Custom colors for the plot (optional)
2542
+ output_dir=settings['dst'], # Directory to save the plot and results
2543
+ save=settings['save'], # Whether to save the plot and results
2544
+ y_axis_start=0, # Starting point for y-axis (optional)
2545
+ error_bar_type='std', # Type of error bar ('std' or 'sem')
2546
+ representation='well',
2547
+ theme=settings['theme'], # Seaborn color palette theme (e.g., 'pastel', 'muted')
2548
+ )
2549
+
2550
+ # Create the plot
2551
+ spacr_graph.create_plot()
2552
+
2553
+ # Get the figure object if needed
2554
+ fig = spacr_graph.get_figure()
2555
+
2556
+ # Optional: Get the results DataFrame containing statistical test results
2557
+ results_df = spacr_graph.get_results()
2558
+ display(results_df)
2559
+ return fig
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.3.32
3
+ Version: 0.3.33
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
@@ -20,7 +20,7 @@ spacr/measure.py,sha256=BThn_sALgKrwGKnLOGpT4FyoJeRVoTZoP9SXbCtCMRw,54857
20
20
  spacr/mediar.py,sha256=FwLvbLQW5LQzPgvJZG8Lw7GniA2vbZx6Jv6vIKu7I5c,14743
21
21
  spacr/ml.py,sha256=3XiQUfhhseCz9cZXhaVkCCv_qfqoZCdXGnO_p3ulwo4,47131
22
22
  spacr/openai.py,sha256=5vBZ3Jl2llYcW3oaTEXgdyCB2aJujMUIO5K038z7w_A,1246
23
- spacr/plot.py,sha256=Lv-QFD_NwP9pdsUIiJ--XHJN-jQBkFz_AI9y4i36jEA,105506
23
+ spacr/plot.py,sha256=7ZeiOlFHDD3Yp9_qrCycEpnuaFVPvRwXgQH_h7YZ94E,111792
24
24
  spacr/sequencing.py,sha256=t18mgpK6rhWuB1LtFOsPxqgpFXxuUmrD06ecsaVQ0Gw,19655
25
25
  spacr/settings.py,sha256=uTTR6pmwBHbZ_uLLWE4cXplGK7q6K_OmZnsXH-HAFW0,75828
26
26
  spacr/sim.py,sha256=1xKhXimNU3ukzIw-3l9cF3Znc_brW8h20yv8fSTzvss,71173
@@ -150,9 +150,9 @@ spacr/resources/icons/umap.png,sha256=dOLF3DeLYy9k0nkUybiZMe1wzHQwLJFRmgccppw-8b
150
150
  spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif,sha256=Tl0ZUfZ_AYAbu0up_nO0tPRtF1BxXhWQ3T3pURBCCRo,7958528
151
151
  spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif,sha256=m8N-V71rA1TT4dFlENNg8s0Q0YEXXs8slIn7yObmZJQ,7958528
152
152
  spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif,sha256=Pbhk7xn-KUP6RSIhJsxQcrHFImBm3GEpLkzx7WOc-5M,7958528
153
- spacr-0.3.32.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
154
- spacr-0.3.32.dist-info/METADATA,sha256=zmqGrPPpr-pTpLbwPpCl0zwLA2oaZ1kGNo90t-nUF5g,5949
155
- spacr-0.3.32.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
156
- spacr-0.3.32.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
157
- spacr-0.3.32.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
158
- spacr-0.3.32.dist-info/RECORD,,
153
+ spacr-0.3.33.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
154
+ spacr-0.3.33.dist-info/METADATA,sha256=sO_89AozvIDEHWwzCw9s8zfwlWGQLLdgrbyC-PVKKTY,5949
155
+ spacr-0.3.33.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
156
+ spacr-0.3.33.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
157
+ spacr-0.3.33.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
158
+ spacr-0.3.33.dist-info/RECORD,,
File without changes