thresholdfloor 0.3.0__tar.gz → 0.3.2__tar.gz

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 (24) hide show
  1. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/LICENSE +21 -21
  2. {thresholdfloor-0.3.0/src/thresholdfloor.egg-info → thresholdfloor-0.3.2}/PKG-INFO +296 -296
  3. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/README.md +274 -274
  4. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/pyproject.toml +36 -36
  5. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/setup.cfg +4 -4
  6. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/__init__.py +816 -809
  7. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/aether_thresher.py +643 -643
  8. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/bundle.py +108 -108
  9. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/elevation.py +625 -357
  10. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/floor_sigil.py +1025 -647
  11. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/shadow_calibration.py +180 -180
  12. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/shadow_simulation.py +194 -194
  13. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/tests/__init__.py +27 -27
  14. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/tests/test_geometric.py +99 -99
  15. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/tests/test_solar.py +127 -127
  16. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/tests/test_threshold.py +190 -190
  17. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/threshold_floor.py +1355 -1303
  18. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2/src/thresholdfloor.egg-info}/PKG-INFO +296 -296
  19. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/MANIFEST.in +0 -0
  20. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor/assets_bundle.pkl +0 -0
  21. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor.egg-info/SOURCES.txt +0 -0
  22. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor.egg-info/dependency_links.txt +0 -0
  23. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor.egg-info/requires.txt +0 -0
  24. {thresholdfloor-0.3.0 → thresholdfloor-0.3.2}/src/thresholdfloor.egg-info/top_level.txt +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Heather Nightfall
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Heather Nightfall
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,296 +1,296 @@
1
- Metadata-Version: 2.4
2
- Name: thresholdfloor
3
- Version: 0.3.0
4
- Summary: A floor below for tuning to what's above
5
- Author: WitchMithras
6
- License: Proprietary (staging)
7
- Requires-Python: >=3.11
8
- Description-Content-Type: text/markdown
9
- License-File: LICENSE
10
- Requires-Dist: aetherfield>=0.5.1
11
- Requires-Dist: moontime>=0.4.9
12
- Requires-Dist: rasterio>=1.4.4
13
- Requires-Dist: python-dateutil>=2.8.0
14
- Requires-Dist: pytz>=2021.0
15
- Requires-Dist: numpy>=1.21.0
16
- Requires-Dist: Pillow>=9.0.0
17
- Requires-Dist: cryptography>=40.0.0
18
- Requires-Dist: scipy>=1.9.0
19
- Requires-Dist: python-dotenv>=0.19.0
20
- Dynamic: license-file
21
-
22
- # ThresholdFloor
23
-
24
- *ThresholdFloor* is a geolocated simulation of light, shadow, and sky.
25
-
26
- It answers a very old question:
27
-
28
- > *If I stand here, what is the sky doing right now?*
29
-
30
- Where *MoonTime* tracks cycles, and *AetherField* tracks positions,
31
- ThresholdFloor brings those movements down to Earth — into light, into shadow, into place.
32
-
33
- ---
34
-
35
- ## 🌍 What It Does
36
-
37
- ThresholdFloor creates a virtual “floor” at a real location on Earth and lets you observe:
38
-
39
- * ☀️ The Sun’s angle across the sky
40
- * 🌗 The shifting length and direction of shadows
41
- * 🌅 Sunrise and sunset behavior
42
- * 🌞 Seasonal turning points (equinoxes, solstices)
43
- * 🌌 Zodiac regions above and below the horizon
44
-
45
- It turns celestial motion into something physical:
46
-
47
- > light touching ground
48
-
49
- ---
50
-
51
- ## 🧭 Core Idea
52
-
53
- In many ancient systems, knowledge of time and season did not come from clocks.
54
-
55
- It came from:
56
-
57
- * shadows on the ground
58
- * the angle of light
59
- * where the sun rose and set
60
-
61
- ThresholdFloor recreates that perspective computationally.
62
-
63
- Instead of asking:
64
-
65
- > *What time is it?*
66
-
67
- You can ask:
68
-
69
- > *Where is the light?*
70
-
71
- ---
72
-
73
- ## 🚀 Quick Example
74
-
75
- ```python
76
- from thresholdfloor import ThresholdFloor as tf
77
-
78
- def test_one():
79
-
80
- tfloor = tf(
81
- name="meow meow tehran",
82
- latitude=35.6892,
83
- longitude=51.3890,
84
- tz="Asia/Tehran"
85
- )
86
-
87
- print(tfloor.get_phase()) # Shadow-based phase
88
-
89
- tfloor.sigil() # Visual representation of current state
90
-
91
- hkfloor = tf(
92
- "meow meow hongkong",
93
- 22.3027,
94
- 114.1772,
95
- "Asia/Hong_Kong",
96
- elevation_m=958
97
- )
98
-
99
- sigil = hkfloor.sigil(show=False)
100
-
101
- print(hkfloor.get_sunrise()) # Sunrise angle
102
-
103
- bfloor = tf(
104
- "meow meow beijing",
105
- 39.9075,
106
- 116.3972,
107
- "Asia/Shanghai",
108
- elevation_m=50
109
- )
110
-
111
- print(bfloor.as_above()) # Zodiac above horizon
112
- print(bfloor.so_below()) # Zodiac below horizon
113
-
114
- tofloor = tf(
115
- "meow meow tokyo",
116
- 35.68972,
117
- 139.69222,
118
- "Asia/Tokyo"
119
- )
120
-
121
- print(tofloor.now()) # Local MoonTime
122
- print(tofloor.observe()) # Current solar geometry
123
- ```
124
-
125
- ---
126
-
127
- ## 🌞 Solar Cycle Example
128
-
129
- ```python
130
- def test_two():
131
-
132
- jfloor = tf(
133
- "Jericho",
134
- latitude=31.871,
135
- longitude=35.443,
136
- tz="Asia/Jerusalem"
137
- )
138
-
139
- # Configure observation point
140
- jfloor.configure_gatehouse(31.8720, 35.4440, -245.0, bearing_deg=90.7)
141
-
142
- # Compute solstice anchors
143
- summer, winter = jfloor.compute_solstice_anchors()
144
-
145
- # Lay out solar markers across the year
146
- jfloor.auto_layout_gate_posts_across_solar_range(
147
- start_date=winter,
148
- days=366,
149
- num_pegs=7,
150
- )
151
-
152
- # Scan solar cycle into months
153
- result = jfloor.scan_solar_cycle_for_months(winter, days=366)
154
-
155
- for m in range(1, 13):
156
- print(f"Month {m}: first hit on {result['first_hits'][m]}")
157
- ```
158
-
159
- ---
160
-
161
- ## 🧩 Core Concepts
162
-
163
- ### Floor
164
-
165
- A *Floor* is a fixed location defined by:
166
-
167
- * latitude
168
- * longitude
169
- * timezone
170
- * optional elevation
171
-
172
- It represents a real place on Earth.
173
-
174
- ---
175
-
176
- ### Observation
177
-
178
- ```python
179
- tfloor.observe()
180
- ```
181
-
182
- Returns the current solar position relative to the floor:
183
-
184
- * altitude
185
- * azimuth
186
- * light direction
187
-
188
- ---
189
-
190
- ### Phase
191
-
192
- ```python
193
- tfloor.get_phase()
194
- ```
195
-
196
- A shadow-based phase derived from solar geometry.
197
-
198
- ---
199
-
200
- ### Sigil
201
-
202
- <p align="center">
203
- <img src="docs/images/sigil_example.png" width="400"/>
204
- </p>
205
-
206
- ```python
207
- tfloor.sigil()
208
- ```
209
-
210
- Generates a visual encoding of the current state of the floor.
211
-
212
- This is an evolving feature and may expand in future releases.
213
-
214
- ---
215
-
216
- ### Horizon Mapping
217
-
218
- ```python
219
- tfloor.as_above()
220
- tfloor.as_below()
221
- ```
222
-
223
- Maps zodiac regions relative to the local horizon.
224
-
225
- ---
226
-
227
- ### Local Time
228
-
229
- ```python
230
- tfloor.now()
231
- ```
232
-
233
- Returns the current moment expressed relative to the floor.
234
-
235
- ---
236
-
237
- ## 🌌 Design Philosophy
238
-
239
- ThresholdFloor is built around a simple inversion:
240
-
241
- Modern systems:
242
-
243
- * abstract time
244
- * global reference
245
- * detached observation
246
-
247
- ThresholdFloor:
248
-
249
- * grounded time
250
- * local reference
251
- * embodied observation
252
-
253
- It does not ask you to synchronize with a global clock.
254
-
255
- It lets you observe what is happening *where you are*.
256
-
257
- ---
258
-
259
- ## 🧬 Ecosystem
260
-
261
- ThresholdFloor builds on:
262
-
263
- * `moontime` → temporal cycles
264
- * `aetherfield` → celestial positions
265
-
266
- Together they form:
267
-
268
- * **Time** → MoonTime
269
- * **Sky** → AetherField
270
- * **Ground** → ThresholdFloor
271
-
272
- ---
273
-
274
- ## 🧪 Status
275
-
276
- Alpha release.
277
-
278
- Core functionality is in place, but APIs and visual systems (such as sigils) are still evolving.
279
-
280
- ---
281
-
282
- ## 🕯️ Closing Note
283
-
284
- There was a time when people did not need instruments to understand the day.
285
-
286
- They could look at a shadow and know:
287
-
288
- * how far the sun had traveled
289
- * what season they were in
290
- * where they stood in the cycle
291
-
292
- ThresholdFloor is an attempt to rebuild that intuition.
293
-
294
- Not by replacing modern systems —
295
-
296
- but by letting light and shadow speak again.
1
+ Metadata-Version: 2.4
2
+ Name: thresholdfloor
3
+ Version: 0.3.2
4
+ Summary: A floor below for tuning to what's above
5
+ Author: WitchMithras
6
+ License: Proprietary (staging)
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: aetherfield>=0.5.1
11
+ Requires-Dist: moontime>=0.4.9
12
+ Requires-Dist: rasterio>=1.4.4
13
+ Requires-Dist: python-dateutil>=2.8.0
14
+ Requires-Dist: pytz>=2021.0
15
+ Requires-Dist: numpy>=1.21.0
16
+ Requires-Dist: Pillow>=9.0.0
17
+ Requires-Dist: cryptography>=40.0.0
18
+ Requires-Dist: scipy>=1.9.0
19
+ Requires-Dist: python-dotenv>=0.19.0
20
+ Dynamic: license-file
21
+
22
+ # ThresholdFloor
23
+
24
+ *ThresholdFloor* is a geolocated simulation of light, shadow, and sky.
25
+
26
+ It answers a very old question:
27
+
28
+ > *If I stand here, what is the sky doing right now?*
29
+
30
+ Where *MoonTime* tracks cycles, and *AetherField* tracks positions,
31
+ ThresholdFloor brings those movements down to Earth — into light, into shadow, into place.
32
+
33
+ ---
34
+
35
+ ## 🌍 What It Does
36
+
37
+ ThresholdFloor creates a virtual “floor” at a real location on Earth and lets you observe:
38
+
39
+ * ☀️ The Sun’s angle across the sky
40
+ * 🌗 The shifting length and direction of shadows
41
+ * 🌅 Sunrise and sunset behavior
42
+ * 🌞 Seasonal turning points (equinoxes, solstices)
43
+ * 🌌 Zodiac regions above and below the horizon
44
+
45
+ It turns celestial motion into something physical:
46
+
47
+ > light touching ground
48
+
49
+ ---
50
+
51
+ ## 🧭 Core Idea
52
+
53
+ In many ancient systems, knowledge of time and season did not come from clocks.
54
+
55
+ It came from:
56
+
57
+ * shadows on the ground
58
+ * the angle of light
59
+ * where the sun rose and set
60
+
61
+ ThresholdFloor recreates that perspective computationally.
62
+
63
+ Instead of asking:
64
+
65
+ > *What time is it?*
66
+
67
+ You can ask:
68
+
69
+ > *Where is the light?*
70
+
71
+ ---
72
+
73
+ ## 🚀 Quick Example
74
+
75
+ ```python
76
+ from thresholdfloor import ThresholdFloor as tf
77
+
78
+ def test_one():
79
+
80
+ tfloor = tf(
81
+ name="meow meow tehran",
82
+ latitude=35.6892,
83
+ longitude=51.3890,
84
+ tz="Asia/Tehran"
85
+ )
86
+
87
+ print(tfloor.get_phase()) # Shadow-based phase
88
+
89
+ tfloor.sigil() # Visual representation of current state
90
+
91
+ hkfloor = tf(
92
+ "meow meow hongkong",
93
+ 22.3027,
94
+ 114.1772,
95
+ "Asia/Hong_Kong",
96
+ elevation_m=958
97
+ )
98
+
99
+ sigil = hkfloor.sigil(show=False)
100
+
101
+ print(hkfloor.get_sunrise()) # Sunrise angle
102
+
103
+ bfloor = tf(
104
+ "meow meow beijing",
105
+ 39.9075,
106
+ 116.3972,
107
+ "Asia/Shanghai",
108
+ elevation_m=50
109
+ )
110
+
111
+ print(bfloor.as_above()) # Zodiac above horizon
112
+ print(bfloor.so_below()) # Zodiac below horizon
113
+
114
+ tofloor = tf(
115
+ "meow meow tokyo",
116
+ 35.68972,
117
+ 139.69222,
118
+ "Asia/Tokyo"
119
+ )
120
+
121
+ print(tofloor.now()) # Local MoonTime
122
+ print(tofloor.observe()) # Current solar geometry
123
+ ```
124
+
125
+ ---
126
+
127
+ ## 🌞 Solar Cycle Example
128
+
129
+ ```python
130
+ def test_two():
131
+
132
+ jfloor = tf(
133
+ "Jericho",
134
+ latitude=31.871,
135
+ longitude=35.443,
136
+ tz="Asia/Jerusalem"
137
+ )
138
+
139
+ # Configure observation point
140
+ jfloor.configure_gatehouse(31.8720, 35.4440, -245.0, bearing_deg=90.7)
141
+
142
+ # Compute solstice anchors
143
+ summer, winter = jfloor.compute_solstice_anchors()
144
+
145
+ # Lay out solar markers across the year
146
+ jfloor.auto_layout_gate_posts_across_solar_range(
147
+ start_date=winter,
148
+ days=366,
149
+ num_pegs=7,
150
+ )
151
+
152
+ # Scan solar cycle into months
153
+ result = jfloor.scan_solar_cycle_for_months(winter, days=366)
154
+
155
+ for m in range(1, 13):
156
+ print(f"Month {m}: first hit on {result['first_hits'][m]}")
157
+ ```
158
+
159
+ ---
160
+
161
+ ## 🧩 Core Concepts
162
+
163
+ ### Floor
164
+
165
+ A *Floor* is a fixed location defined by:
166
+
167
+ * latitude
168
+ * longitude
169
+ * timezone
170
+ * optional elevation
171
+
172
+ It represents a real place on Earth.
173
+
174
+ ---
175
+
176
+ ### Observation
177
+
178
+ ```python
179
+ tfloor.observe()
180
+ ```
181
+
182
+ Returns the current solar position relative to the floor:
183
+
184
+ * altitude
185
+ * azimuth
186
+ * light direction
187
+
188
+ ---
189
+
190
+ ### Phase
191
+
192
+ ```python
193
+ tfloor.get_phase()
194
+ ```
195
+
196
+ A shadow-based phase derived from solar geometry.
197
+
198
+ ---
199
+
200
+ ### Sigil
201
+
202
+ <p align="center">
203
+ <img src="docs/images/sigil_example.png" width="400"/>
204
+ </p>
205
+
206
+ ```python
207
+ tfloor.sigil()
208
+ ```
209
+
210
+ Generates a visual encoding of the current state of the floor.
211
+
212
+ This is an evolving feature and may expand in future releases.
213
+
214
+ ---
215
+
216
+ ### Horizon Mapping
217
+
218
+ ```python
219
+ tfloor.as_above()
220
+ tfloor.so_below()
221
+ ```
222
+
223
+ Maps zodiac regions relative to the local horizon.
224
+
225
+ ---
226
+
227
+ ### Local Time
228
+
229
+ ```python
230
+ tfloor.now()
231
+ ```
232
+
233
+ Returns the current moment expressed relative to the floor.
234
+
235
+ ---
236
+
237
+ ## 🌌 Design Philosophy
238
+
239
+ ThresholdFloor is built around a simple inversion:
240
+
241
+ Modern systems:
242
+
243
+ * abstract time
244
+ * global reference
245
+ * detached observation
246
+
247
+ ThresholdFloor:
248
+
249
+ * grounded time
250
+ * local reference
251
+ * embodied observation
252
+
253
+ It does not ask you to synchronize with a global clock.
254
+
255
+ It lets you observe what is happening *where you are*.
256
+
257
+ ---
258
+
259
+ ## 🧬 Ecosystem
260
+
261
+ ThresholdFloor builds on:
262
+
263
+ * `moontime` → temporal cycles
264
+ * `aetherfield` → celestial positions
265
+
266
+ Together they form:
267
+
268
+ * **Time** → MoonTime
269
+ * **Sky** → AetherField
270
+ * **Ground** → ThresholdFloor
271
+
272
+ ---
273
+
274
+ ## 🧪 Status
275
+
276
+ Alpha release.
277
+
278
+ Core functionality is in place, but APIs and visual systems (such as sigils) are still evolving.
279
+
280
+ ---
281
+
282
+ ## 🕯️ Closing Note
283
+
284
+ There was a time when people did not need instruments to understand the day.
285
+
286
+ They could look at a shadow and know:
287
+
288
+ * how far the sun had traveled
289
+ * what season they were in
290
+ * where they stood in the cycle
291
+
292
+ ThresholdFloor is an attempt to rebuild that intuition.
293
+
294
+ Not by replacing modern systems —
295
+
296
+ but by letting light and shadow speak again.