weac 2.6.3__py3-none-any.whl → 3.0.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.
weac/__init__.py CHANGED
@@ -1,17 +1,5 @@
1
1
  """
2
- WEak Layer AntiCrack nucleation model.
3
-
4
- Implementation of closed-form analytical models for the analysis of
5
- dry-snow slab avalanche release.
2
+ WEAC - Weak Layer Anticrack Nucleation Model
6
3
  """
7
4
 
8
- # Module imports
9
- from weac import plot
10
- from weac.inverse import Inverse
11
- from weac.layered import Layered
12
-
13
- # Version
14
- __version__ = "2.6.3"
15
-
16
- # Public names
17
- __all__ = ["Layered", "Inverse", "plot"]
5
+ __version__ = "3.0.0"
weac/constants.py ADDED
@@ -0,0 +1,37 @@
1
+ """
2
+ Constants for the WEAC simulation.
3
+ """
4
+
5
+ from typing import Final
6
+
7
+ G_MM_S2: Final[float] = 9810.0 # gravitational acceleration (mm s⁻²)
8
+ NU: Final[float] = 0.25 # Global Poisson's ratio
9
+ SHEAR_CORRECTION_FACTOR: Final[float] = 5.0 / 6.0 # Shear-correction factor (slabs)
10
+ STIFFNESS_COLLAPSE_FACTOR: Final[float] = (
11
+ 1000.0 # Stiffness ratio between collapsed and uncollapsed weak layer.
12
+ )
13
+ ROMBERG_TOL: Final[float] = 1e-3 # Romberg integration tolerance
14
+ LSKI_MM: Final[float] = 1000.0 # Effective out-of-plane length of skis (mm)
15
+ EPS: Final[float] = 1e-9 # Global numeric tolerance for float comparisons
16
+
17
+ RHO_ICE: Final[float] = 916.7 # Density of ice (kg/m^3)
18
+ CB0: Final[float] = (
19
+ 6.5
20
+ # Multiplicative constant of Young modulus
21
+ # parametrization according to Bergfeld et al. (2023)
22
+ )
23
+ CB1: Final[float] = (
24
+ 4.4
25
+ # Exponent of Young modulus parameterization
26
+ # according to Bergfeld et al. (2023)
27
+ )
28
+ CG0: Final[float] = (
29
+ 6.0
30
+ # Multiplicative constant of Young modulus
31
+ # parametrization according to Gerling et al. (2017)
32
+ )
33
+ CG1: Final[float] = (
34
+ 4.5
35
+ # Exponent of Young modulus parameterization
36
+ # according to Gerling et al. (2017)
37
+ )
weac/logging_config.py ADDED
@@ -0,0 +1,39 @@
1
+ """
2
+ Logging configuration for weak layer anticrack nucleation model.
3
+ """
4
+
5
+ import os
6
+ from logging.config import dictConfig
7
+ from typing import Optional
8
+
9
+
10
+ def setup_logging(level: Optional[str] = None) -> None:
11
+ """
12
+ Initialise the global logging configuration exactly once.
13
+ The level is taken from the env var WEAC_LOG_LEVEL (default WARNING).
14
+ """
15
+ if level is None:
16
+ level = os.getenv("WEAC_LOG_LEVEL", "WARNING").upper()
17
+
18
+ dictConfig(
19
+ {
20
+ "version": 1,
21
+ "disable_existing_loggers": False, # keep third-party loggers alive
22
+ "formatters": {
23
+ "console": {
24
+ "format": "%(asctime)s | %(levelname)-8s | %(name)s: %(message)s",
25
+ },
26
+ },
27
+ "handlers": {
28
+ "console": {
29
+ "class": "logging.StreamHandler",
30
+ "formatter": "console",
31
+ "level": level,
32
+ },
33
+ },
34
+ "root": { # applies to *all* loggers
35
+ "handlers": ["console"],
36
+ "level": level,
37
+ },
38
+ }
39
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weac
3
- Version: 2.6.3
3
+ Version: 3.0.0
4
4
  Summary: Weak layer anticrack nucleation model
5
5
  Author-email: 2phi GbR <mail@2phi.de>
6
6
  License: Proprietary
@@ -9,31 +9,53 @@ Project-URL: Demo, https://github.com/2phi/weac/blob/main/demo/demo.ipynb
9
9
  Project-URL: Documentation, https://2phi.github.io/weac
10
10
  Project-URL: Issues and feature requests, https://github.com/2phi/weac/issues
11
11
  Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
12
14
  Classifier: License :: Other/Proprietary License
13
15
  Classifier: Operating System :: OS Independent
14
16
  Classifier: Topic :: Scientific/Engineering
15
- Requires-Python: >=3.10
17
+ Requires-Python: >=3.12
16
18
  Description-Content-Type: text/markdown
17
19
  License-File: LICENSE
18
20
  Requires-Dist: matplotlib>=3.9.1
19
21
  Requires-Dist: numpy>=2.0.1
20
22
  Requires-Dist: scipy>=1.14.0
23
+ Requires-Dist: pydantic>=2.11.7
24
+ Requires-Dist: snowpylot>=1.1.3
21
25
  Provides-Extra: interactive
22
26
  Requires-Dist: jupyter; extra == "interactive"
23
- Requires-Dist: ipython>=8.12.3; extra == "interactive"
24
- Requires-Dist: notebook>=7.0.0; extra == "interactive"
25
- Requires-Dist: ipywidgets>=8.0.0; extra == "interactive"
27
+ Requires-Dist: ipython>=8.37.0; extra == "interactive"
28
+ Requires-Dist: ipykernel>=6.30.1; extra == "interactive"
29
+ Requires-Dist: jupyter_client>=8.6.3; extra == "interactive"
30
+ Requires-Dist: jupyter_core>=5.8.1; extra == "interactive"
31
+ Requires-Dist: matplotlib-inline>=0.1.7; extra == "interactive"
32
+ Requires-Dist: nest-asyncio>=1.6.0; extra == "interactive"
33
+ Requires-Dist: pyzmq>=27.0.1; extra == "interactive"
34
+ Requires-Dist: tornado>=6.5.2; extra == "interactive"
35
+ Requires-Dist: traitlets>=5.14.3; extra == "interactive"
26
36
  Provides-Extra: docs
27
37
  Requires-Dist: sphinx; extra == "docs"
28
38
  Requires-Dist: sphinxawesome-theme; extra == "docs"
29
- Provides-Extra: test
30
- Requires-Dist: pytest>=7.0.0; extra == "test"
31
- Requires-Dist: pytest-cov>=4.0.0; extra == "test"
32
39
  Provides-Extra: dev
33
- Requires-Dist: black>=23.0.0; extra == "dev"
34
- Requires-Dist: mypy>=1.0.0; extra == "dev"
35
- Requires-Dist: pytest>=7.0.0; extra == "dev"
36
- Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
40
+ Requires-Dist: nbclient>=0.10.0; extra == "dev"
41
+ Requires-Dist: nbconvert>=7.16.4; extra == "dev"
42
+ Requires-Dist: nbformat>=5.10.0; extra == "dev"
43
+ Requires-Dist: jupyter; extra == "dev"
44
+ Requires-Dist: ipython>=8.37.0; extra == "dev"
45
+ Requires-Dist: ipykernel>=6.30.1; extra == "dev"
46
+ Requires-Dist: jupyter_client>=8.6.3; extra == "dev"
47
+ Requires-Dist: jupyter_core>=5.8.1; extra == "dev"
48
+ Requires-Dist: matplotlib-inline>=0.1.7; extra == "dev"
49
+ Requires-Dist: nest-asyncio>=1.6.0; extra == "dev"
50
+ Requires-Dist: pyzmq>=27.0.1; extra == "dev"
51
+ Requires-Dist: tornado>=6.5.2; extra == "dev"
52
+ Requires-Dist: traitlets>=5.14.3; extra == "dev"
53
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
54
+ Requires-Dist: pylint>=3.2.0; extra == "dev"
55
+ Requires-Dist: pycodestyle>=2.11.1; extra == "dev"
56
+ Requires-Dist: black>=24.4.0; extra == "dev"
57
+ Requires-Dist: isort>=5.13.0; extra == "dev"
58
+ Requires-Dist: bump2version>=1.0.1; extra == "dev"
37
59
  Dynamic: license-file
38
60
 
39
61
  <!-- LOGO AND TITLE-->
@@ -72,7 +94,7 @@ Dynamic: license-file
72
94
  <a href="https://github.com/2phi/weac/issues">Report a bug</a> ·
73
95
  <a href="https://github.com/2phi/weac/issues">Request a feature</a> ·
74
96
  <a href="https://2phi.github.io/weac/">Read the docs</a> ·
75
- <a href="https://github.com/2phi/weac/blob/main/CITATION.cff)">Cite the software</a>
97
+ <a href="https://github.com/2phi/weac/blob/main/CITATION.cff">Cite the software</a>
76
98
  <br>
77
99
  <br>
78
100
  <br>
@@ -103,6 +125,7 @@ Dynamic: license-file
103
125
 
104
126
  <!-- TABLE OF CONTENTS -->
105
127
  ## Contents
128
+
106
129
  1. [About the project](#about-the-project)
107
130
  2. [Installation](#installation)
108
131
  3. [Usage](#usage)
@@ -112,8 +135,6 @@ Dynamic: license-file
112
135
  7. [License](#license)
113
136
  8. [Contact](#contact)
114
137
 
115
-
116
-
117
138
  <!-- ABOUT THE PROJECT -->
118
139
  ## About the project
119
140
 
@@ -158,11 +179,15 @@ git clone https://github.com/2phi/weac
158
179
  ```
159
180
  for local use.
160
181
 
161
- Needs (see also [requirements.txt](https://github.com/2phi/weac/blob/main/weac/requirements.txt)):
162
- - [Python](https://www.python.org/downloads/release/python-3100/) &ge; 3.10
163
- - [Numpy](https://numpy.org/) &ge; 2.0.1
164
- - [Scipy](https://www.scipy.org/) &ge; 1.14.0
165
- - [Matplotlib](https://matplotlib.org/) &ge; 3.9.1
182
+ Needs (runtime dependencies are declared in [pyproject.toml](https://github.com/2phi/weac/blob/main/pyproject.toml)):
183
+
184
+ - [Python](https://www.python.org/downloads/release/python-3120/) 3.12
185
+ - [Numpy](https://numpy.org/) 2.0.1
186
+ - [Scipy](https://www.scipy.org/) 1.14.0
187
+ - [Matplotlib](https://matplotlib.org/) ≥ 3.9.1
188
+ - [Pydantic](https://docs.pydantic.dev/latest/) ≥ 2.11.7
189
+ - [Snowpylot](https://github.com/connellymk/snowpylot) ≥ 1.1.3
190
+
166
191
 
167
192
  <!-- USAGE EXAMPLES -->
168
193
  ## Usage
@@ -170,55 +195,141 @@ Needs (see also [requirements.txt](https://github.com/2phi/weac/blob/main/weac/r
170
195
  The following describes the basic usage of WEAC. Please refer to the [demo](https://github.com/2phi/weac/blob/main/demo/demo.ipynb) for more examples and read the [documentation](https://2phi.github.io/weac/) for details.
171
196
 
172
197
  Load the module.
198
+
173
199
  ```python
174
200
  import weac
175
201
  ```
176
- Choose a snow profile from the database (see [demo](https://github.com/2phi/weac/blob/main/demo/demo.ipynb)) or create your own as a 2D array where the columns are density (kg/m^2) and layer thickness (mm). One row corresponds to one layer counted from top (below surface) to bottom (above weak layer).
202
+
203
+ Choose a snow profile from the preconfigured profiles (see `dummy_profiles` in [demo](https://github.com/2phi/weac/blob/main/demo/demo.ipynb)) or create your own using the `Layer` Pydantic class. One row corresponds to one layer counted from top (below surface) to bottom (above weak layer).
204
+
177
205
  ```python
178
- myprofile = [[170, 100], # (1) surface layer
179
- [190, 40], # (2)
180
- [230, 130], # :
181
- [250, 20], # :
182
- [210, 70], # (i)
183
- [380, 20], # :
184
- [280, 100]] # (N) last slab layer above weak layer
206
+ from weac.components import Layer
207
+
208
+ layers = [
209
+ Layer(rho=170, h=100), # (1) surface layer
210
+ Layer(rho=190, h=40), # (2)
211
+ Layer(rho=230, h=130), # :
212
+ Layer(rho=250, h=20),
213
+ Layer(rho=210, h=70),
214
+ Layer(rho=380, h=20), # :
215
+ Layer(rho=280, h=100) # (N) last slab layer above weak layer
216
+ ]
185
217
  ```
186
- Create a model instance with optional custom layering.
218
+
219
+ Create a WeakLayer instance that lies underneath the slab.
220
+
187
221
  ```python
188
- skier = weac.Layered(system='skier', layers=myprofile)
222
+ from weac.components import WeakLayer
223
+
224
+ weak_layer = WeakLayer(rho=125, h=20)
189
225
  ```
190
- Calculate lists of segment lengths, locations of foundations, and position and magnitude of skier loads from the inputs total length `L` (mm), crack length `a` (mm), and skier weight `m` (kg). We can choose to analyze the situtation before a crack appears even if a crack length > 0 is set by replacing the `'crack'` key thorugh the `'nocrack'` key.
226
+
227
+ Create a Scenario that defines the environment and setup that the slab and weak layer will be evaluated in.
228
+
191
229
  ```python
192
- segments = skier.calc_segments(L=10000, a=300, m=80)['crack']
230
+ from weac.components import ScenarioConfig, Segment
231
+
232
+ # Example 1: SKIER
233
+ skier_config = ScenarioConfig(
234
+ system_type='skier',
235
+ phi=30,
236
+ )
237
+ skier_segments = [
238
+ Segment(length=5000, has_foundation=True, m=0),
239
+ Segment(length=0, has_foundation=False, m=80),
240
+ Segment(length=0, has_foundation=False, m=0),
241
+ Segment(length=5000, has_foundation=True, m=0),
242
+ ] # Scenario is a skier of 80 kg standing on a 10 meter long slab at a 30 degree angle
243
+
244
+ # Exampel 2: PST
245
+ pst_config = ScenarioConfig(
246
+ system_type='pst-', # Downslope cut
247
+ phi=30, # (counterclockwise positive)
248
+ cut_length=300,
249
+ )
250
+ pst_segments = [
251
+ Segment(length=5000, has_foundation=True, m=0),
252
+ Segment(length=300, has_foundation=False, m=0), # Crack Segment
253
+ ] # Scenario is Downslope PST with a 300mm cut
193
254
  ```
194
- Assemble the system of linear equations and solve the boundary-value problem for the free constants `C` providing the inclination `phi` (counterclockwise positive) in degrees.
255
+
256
+ Create a SystemModel instance that combines the inputs and handles system solving and field-quantity extraction.
257
+
258
+ ```python
259
+ from weac.components import Config, ModelInput
260
+ from weac.core.system_model import SystemModel
261
+
262
+ # Example: build a model for the skier scenario defined above
263
+ model_input = ModelInput(
264
+ weak_layer=weak_layer,
265
+ scenario_config=skier_config,
266
+ layers=custom_layers,
267
+ segments=skier_segments,
268
+ )
269
+ system_config = Config(
270
+ touchdown=True
271
+ )
272
+ skier_system = SystemModel(
273
+ model_input=model_input,
274
+ config=system_config,
275
+ )
276
+ ```
277
+
278
+ Unknown constants are cached_properties; calling `skier_system.unknown_constants` solves the system of linear equations and extracts the constants.
279
+
195
280
  ```python
196
- C = skier.assemble_and_solve(phi=38, **segments)
281
+ C = skier_system.unknown_constants
197
282
  ```
283
+
284
+ Analyzer handles rasterization + computation of involved slab and weak-layer properties `Sxx`, `Sxz`, etc.
198
285
  Prepare the output by rasterizing the solution vector at all horizontal positions `xsl` (slab). The result is returned in the form of the ndarray `z`. We also get `xwl` (weak layer) that only contains x-coordinates that are supported by a foundation.
286
+
199
287
  ```python
200
- xsl, z, xwl = skier.rasterize_solution(C=C, phi=38, **segments)
288
+ from weac.analysis.analyzer import Analyzer
289
+
290
+ skier_analyzer = Analyzer(skier_system)
291
+ xsl_skier, z_skier, xwl_skier = skier_analyzer.rasterize_solution(mode="cracked")
292
+ Gdif, GdifI, GdifII = skier_analyzer.differential_ERR()
293
+ Ginc, GincI, GincII = skier_analyzer.incremental_ERR()
294
+ # and Sxx, Sxz, Tzz, principal stress, incremental_potential, ...
201
295
  ```
296
+
202
297
  Visualize the results.
298
+
203
299
  ```python
300
+ from weac.analysis.plotter import Plotter
301
+
302
+ plotter = Plotter()
303
+ # Visualize slab profile
304
+ fig = plotter.plot_slab_profile(
305
+ weak_layers=weak_layer,
306
+ slabs=skier_system.slab,
307
+ )
308
+
204
309
  # Visualize deformations as a contour plot
205
- weac.plot.deformed(skier, xsl=xsl_skier, xwl=xwl_skier, z=z_skier,
206
- phi=inclination, window=200, scale=200,
207
- field='principal')
310
+ fig = plotter.plot_deformed(
311
+ xsl_skier, xwl_skier, z_skier, skier_analyzer, scale=200, window=200, aspect=2, field="Sxx"
312
+ )
208
313
 
209
314
  # Plot slab displacements (using x-coordinates of all segments, xsl)
210
- weac.plot.displacements(skier, x=xsl, z=z, **segments)
211
-
315
+ plotter.plot_displacements(skier_analyzer, x=xsl_skier, z=z_skier)
212
316
  # Plot weak-layer stresses (using only x-coordinates of bedded segments, xwl)
213
- weac.plot.stresses(skier, x=xwl, z=z, **segments)
317
+ plotter.plot_stresses(skier_analyzer, x=xwl_skier, z=z_skier)
214
318
  ```
215
- Compute output quantities for exporting or plotting.
216
- ```python
217
- # Slab deflections (using x-coordinates of all segments, xsl)
218
- x_cm, w_um = skier.get_slab_deflection(x=xsl, z=z, unit='um')
219
319
 
220
- # Weak-layer shear stress (using only x-coordinates of bedded segments, xwl)
221
- x_cm, tau_kPa = skier.get_weaklayer_shearstress(x=xwl, z=z, unit='kPa')
320
+ Compute output/field quantities for exporting or plotting.
321
+
322
+ ```python
323
+ # Compute stresses in kPa in the weaklayer
324
+ tau = skier_system.fq.tau(Z=z_skier, unit='kPa')
325
+ sig = skier_system.fq.sig(Z=z_skier, unit='kPa')
326
+
327
+ w = skier_system.fq.w(Z=z_skier, unit='um')
328
+ # Example evaluation vertical displacement at top/mid/bottom of the slab
329
+ u_top = skier_system.fq.u(Z=z_skier, h0=top, unit='um')
330
+ u_mid = skier_system.fq.u(Z=z_skier, h0=mid, unit='um')
331
+ u_bot = skier_system.fq.u(Z=z_skier, h0=bot, unit='um')
332
+ psi = skier_system.fq.psi(Z=z_skier, unit='deg')
222
333
  ```
223
334
 
224
335
  <!-- ROADMAP -->
@@ -226,33 +337,50 @@ x_cm, tau_kPa = skier.get_weaklayer_shearstress(x=xwl, z=z, unit='kPa')
226
337
 
227
338
  See the [open issues](https://github.com/2phi/weac/issues) for a list of proposed features and known issues.
228
339
 
229
- ### v3.0
340
+ ### v4.0
230
341
 
231
- - [ ] New mathematical foundation to improve the weak-layer representation
342
+ - [ ] Change to scenario & scenario_config: InfEnd/Cut/Segment/Weight
343
+
344
+ ### v3.2
345
+ <!-- - [ ] New mathematical foundation to improve the weak-layer representation -->
232
346
  - [ ] Complex terrain through the addition of out-of-plane tilt
233
347
  - [ ] Up, down, and cross-slope cracks
234
348
 
235
- ### v2.7
236
- - [ ] Finite fracture mechanics implementation for layered snow covers
349
+ ### v3.1
237
350
 
238
- ### v2.6
239
- - [ ] Implement anistropic weak layer
240
- - [ ] Add demo gif
351
+ - [ ] Improved CriteriaEvaluator Optimization (x2 time reduction)
241
352
 
242
353
  ## Release history
243
354
 
355
+ ### v3.0
356
+
357
+ - Refactored the codebase for improved structure and maintainability
358
+ - Added property caching for improved efficiency
359
+ - Added input validation
360
+ - Adopted a new, modular, and object-oriented design
361
+
362
+ ### v2.6
363
+
364
+ - Introduced test suite
365
+ - Mitraged from `setup.cfg` to `pyproject.toml`
366
+ - Added parametrization for collaps heights
367
+
244
368
  ### v2.5
369
+
245
370
  - Analyze slab touchdown in PST experiments by setting `touchdown=True`
246
371
  - Completely redesigned and significantly improved API documentation
247
372
 
248
373
  ### v2.4
249
- - Choose between slope-normal (`'-pst'`, `'pst-'`) or vertial (`'-vpst'`, `'vpst-'`) PST boundary conditions
374
+
375
+ - Choose between slope-normal (`'-pst'`, `'pst-'`) or vertical (`'-vpst'`, `'vpst-'`) PST boundary conditions
250
376
 
251
377
  ### v2.3
378
+
252
379
  - Stress plots on deformed contours
253
380
  - PSTs now account for slab touchdown
254
381
 
255
382
  ### v2.2
383
+
256
384
  - Sign of inclination `phi` consistent with the coordinate system (positive counterclockwise)
257
385
  - Dimension arguments to field-quantity methods added
258
386
  - Improved aspect ratio of profile views and contour plots
@@ -262,11 +390,13 @@ See the [open issues](https://github.com/2phi/weac/issues) for a list of propose
262
390
  - Now allows for distributed surface loads
263
391
 
264
392
  ### v2.1
393
+
265
394
  - Consistent use of coordinate system with downward pointing z-axis
266
395
  - Consitent top-to-bottom numbering of slab layers
267
396
  - Implementation of PSTs cut from either left or right side
268
397
 
269
398
  ### v2.0
399
+
270
400
  - Completely rewritten in 🐍 Python
271
401
  - Coupled bending-extension ODE solver implemented
272
402
  - Stress analysis of arbitrarily layered snow slabs
@@ -286,24 +416,26 @@ See the [open issues](https://github.com/2phi/weac/issues) for a list of propose
286
416
  - Finite fracture mechanics implementation
287
417
  - Prediction of anticrack nucleation
288
418
 
289
-
290
419
  <!-- CONTRIBUTING -->
291
420
  ## How to contribute
292
421
 
293
422
  1. Fork the project
294
- 2. Create your feature branch (`git checkout -b feature/amazingfeature`)
295
- 3. Commit your changes (`git commit -m 'Add some amazing feature'`)
296
- 4. Push to the branch (`git push origin feature/amazingfeature`)
297
- 5. Open a pull request
423
+ 2. Initialize submodules
298
424
 
425
+ ```bash
426
+ git submodule update --init --recursive
427
+ ```
428
+
429
+ 3. Create your feature branch (`git checkout -b feature/amazingfeature`)
430
+ 4. Commit your changes (`git commit -m 'Add some amazing feature'`)
431
+ 5. Push to the branch (`git push origin feature/amazingfeature`)
432
+ 6. Open a pull request
299
433
 
300
434
  <!-- WORKFLOWS -->
301
435
  ## Workflows
302
436
  [![Publish Python 🐍 releases 📦 to PyPI ](https://github.com/2phi/weac/actions/workflows/release.yml/badge.svg)](https://github.com/2phi/weac/actions/workflows/release.yml)<br>
303
437
  [![Build and publish Sphinx 🪬 documentation ](https://github.com/2phi/weac/actions/workflows/docs.yml/badge.svg)](https://github.com/2phi/weac/actions/workflows/docs.yml)
304
438
 
305
-
306
-
307
439
  <!-- LICENSE -->
308
440
  ## License
309
441
 
@@ -0,0 +1,8 @@
1
+ weac/__init__.py,sha256=dv7A3r-vIVUaQJDEt5pxC8IJq_Lej2camGA7fIhTsmc,76
2
+ weac/constants.py,sha256=BX8ifZhFciCuzzako1p-2Wh5CWWzR3cPdvyu501UtUs,1194
3
+ weac/logging_config.py,sha256=BFphsxo5s_7E6rPOO2PbOfu0Wy8zHD4AUnnJdqvrn5I,1134
4
+ weac-3.0.0.dist-info/licenses/LICENSE,sha256=CZlY87tZ1Kq7QxKLVrMknnDXGpc1yEZ8SKoXMAk-d4k,1463
5
+ weac-3.0.0.dist-info/METADATA,sha256=lDtqRgn6B42TJM7ju83uFvlzzjkFm93qFIIa99-vI-g,23679
6
+ weac-3.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
+ weac-3.0.0.dist-info/top_level.txt,sha256=8tyXUHPFU4Ba_5kPtpwvXo5l6GjJmOnODVBJFygpdeE,5
8
+ weac-3.0.0.dist-info/RECORD,,