notionary 0.2.12__py3-none-any.whl → 0.2.14__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.
Files changed (86) hide show
  1. notionary/__init__.py +3 -20
  2. notionary/{notion_client.py → base_notion_client.py} +92 -98
  3. notionary/blocks/__init__.py +61 -0
  4. notionary/{elements → blocks}/audio_element.py +6 -4
  5. notionary/{elements → blocks}/bookmark_element.py +3 -6
  6. notionary/{elements → blocks}/bulleted_list_element.py +5 -7
  7. notionary/{elements → blocks}/callout_element.py +5 -8
  8. notionary/{elements → blocks}/code_block_element.py +4 -6
  9. notionary/{elements → blocks}/column_element.py +3 -6
  10. notionary/{elements → blocks}/divider_element.py +3 -6
  11. notionary/{elements → blocks}/embed_element.py +4 -6
  12. notionary/{elements → blocks}/heading_element.py +5 -9
  13. notionary/{elements → blocks}/image_element.py +4 -6
  14. notionary/{elements → blocks}/mention_element.py +3 -7
  15. notionary/blocks/notion_block_client.py +26 -0
  16. notionary/blocks/notion_block_element.py +34 -0
  17. notionary/{elements → blocks}/numbered_list_element.py +4 -7
  18. notionary/{elements → blocks}/paragraph_element.py +4 -7
  19. notionary/{prompting/element_prompt_content.py → blocks/prompts/element_prompt_builder.py} +1 -40
  20. notionary/blocks/prompts/element_prompt_content.py +41 -0
  21. notionary/{elements → blocks}/qoute_element.py +4 -6
  22. notionary/{elements → blocks}/registry/block_registry.py +4 -26
  23. notionary/{elements → blocks}/registry/block_registry_builder.py +26 -25
  24. notionary/{elements → blocks}/table_element.py +6 -8
  25. notionary/{elements → blocks}/text_inline_formatter.py +1 -4
  26. notionary/{elements → blocks}/todo_element.py +6 -8
  27. notionary/{elements → blocks}/toggle_element.py +3 -6
  28. notionary/{elements → blocks}/toggleable_heading_element.py +5 -8
  29. notionary/{elements → blocks}/video_element.py +4 -6
  30. notionary/cli/main.py +245 -53
  31. notionary/cli/onboarding.py +117 -0
  32. notionary/database/__init__.py +0 -0
  33. notionary/database/client.py +132 -0
  34. notionary/database/database_exceptions.py +13 -0
  35. notionary/database/factory.py +0 -0
  36. notionary/database/filter_builder.py +175 -0
  37. notionary/database/notion_database.py +339 -128
  38. notionary/database/notion_database_provider.py +230 -0
  39. notionary/elements/__init__.py +0 -0
  40. notionary/models/notion_database_response.py +294 -13
  41. notionary/models/notion_page_response.py +9 -31
  42. notionary/models/search_response.py +0 -0
  43. notionary/page/__init__.py +0 -0
  44. notionary/page/client.py +110 -0
  45. notionary/page/content/page_content_retriever.py +5 -20
  46. notionary/page/content/page_content_writer.py +3 -4
  47. notionary/page/formatting/markdown_to_notion_converter.py +1 -3
  48. notionary/{prompting → page}/markdown_syntax_prompt_generator.py +1 -2
  49. notionary/page/notion_page.py +354 -317
  50. notionary/page/notion_to_markdown_converter.py +1 -4
  51. notionary/page/properites/property_value_extractor.py +0 -64
  52. notionary/page/{properites/property_formatter.py → property_formatter.py} +7 -4
  53. notionary/page/search_filter_builder.py +131 -0
  54. notionary/page/utils.py +60 -0
  55. notionary/util/__init__.py +12 -3
  56. notionary/util/factory_decorator.py +33 -0
  57. notionary/util/fuzzy_matcher.py +82 -0
  58. notionary/util/page_id_utils.py +0 -21
  59. notionary/util/singleton_metaclass.py +22 -0
  60. notionary/workspace.py +69 -0
  61. {notionary-0.2.12.dist-info → notionary-0.2.14.dist-info}/METADATA +4 -1
  62. notionary-0.2.14.dist-info/RECORD +72 -0
  63. notionary/database/database_discovery.py +0 -142
  64. notionary/database/notion_database_factory.py +0 -193
  65. notionary/elements/notion_block_element.py +0 -70
  66. notionary/exceptions/database_exceptions.py +0 -76
  67. notionary/exceptions/page_creation_exception.py +0 -9
  68. notionary/page/metadata/metadata_editor.py +0 -150
  69. notionary/page/metadata/notion_icon_manager.py +0 -77
  70. notionary/page/metadata/notion_page_cover_manager.py +0 -56
  71. notionary/page/notion_page_factory.py +0 -332
  72. notionary/page/properites/database_property_service.py +0 -302
  73. notionary/page/properites/page_property_manager.py +0 -152
  74. notionary/page/relations/notion_page_relation_manager.py +0 -350
  75. notionary/page/relations/notion_page_title_resolver.py +0 -104
  76. notionary/page/relations/page_database_relation.py +0 -68
  77. notionary/telemetry/__init__.py +0 -7
  78. notionary/telemetry/telemetry.py +0 -226
  79. notionary/telemetry/track_usage_decorator.py +0 -76
  80. notionary/util/warn_direct_constructor_usage.py +0 -54
  81. notionary-0.2.12.dist-info/RECORD +0 -70
  82. /notionary/util/{singleton.py → singleton_decorator.py} +0 -0
  83. {notionary-0.2.12.dist-info → notionary-0.2.14.dist-info}/WHEEL +0 -0
  84. {notionary-0.2.12.dist-info → notionary-0.2.14.dist-info}/entry_points.txt +0 -0
  85. {notionary-0.2.12.dist-info → notionary-0.2.14.dist-info}/licenses/LICENSE +0 -0
  86. {notionary-0.2.12.dist-info → notionary-0.2.14.dist-info}/top_level.txt +0 -0
@@ -1,226 +0,0 @@
1
- import os
2
- import uuid
3
- import atexit
4
- import signal
5
- import threading
6
- from pathlib import Path
7
- from typing import Dict, Any, Optional
8
- from posthog import Posthog
9
- from dotenv import load_dotenv
10
-
11
- from notionary.util import LoggingMixin
12
- from notionary.util import singleton
13
-
14
- load_dotenv()
15
-
16
- @singleton
17
- class NotionaryTelemetry(LoggingMixin):
18
- """
19
- Anonymous telemetry for Notionary - enabled by default.
20
- Disable via: ANONYMIZED_TELEMETRY=false
21
- """
22
-
23
- USER_ID_PATH = str(Path.home() / ".cache" / "notionary" / "telemetry_user_id")
24
- PROJECT_API_KEY = (
25
- "phc_gItKOx21Tc0l07C1taD0QPpqFnbWgWjVfRjF6z24kke" # write-only so no worries
26
- )
27
- HOST = "https://eu.i.posthog.com"
28
-
29
- _logged_init_message = False
30
-
31
- def __init__(self):
32
- # Default: enabled, disable via ANONYMIZED_TELEMETRY=false
33
- telemetry_setting = os.getenv("ANONYMIZED_TELEMETRY", "true").lower()
34
- self.enabled = telemetry_setting != "false"
35
-
36
- self._user_id = None
37
- self._client = None
38
- self._shutdown_lock = threading.Lock()
39
- self._is_shutdown = False
40
- self._shutdown_registered = False
41
-
42
- if self.enabled:
43
- self._initialize_client()
44
- self._register_shutdown_handlers()
45
-
46
- def _register_shutdown_handlers(self):
47
- """Register shutdown handlers for clean exit"""
48
- with self._shutdown_lock:
49
- if self._shutdown_registered:
50
- return
51
-
52
- try:
53
- # Register atexit handler for normal program termination
54
- atexit.register(self._atexit_handler)
55
-
56
- # Register signal handlers for SIGINT (Ctrl+C) and SIGTERM
57
- signal.signal(signal.SIGINT, self._signal_handler)
58
- signal.signal(signal.SIGTERM, self._signal_handler)
59
-
60
- self._shutdown_registered = True
61
- self.logger.debug("Telemetry shutdown handlers registered")
62
-
63
- except Exception as e:
64
- self.logger.debug(f"Failed to register shutdown handlers: {e}")
65
-
66
- def _signal_handler(self, signum, frame):
67
- """Handle SIGINT (Ctrl+C) and SIGTERM signals"""
68
- signal_name = "SIGINT" if signum == signal.SIGINT else f"SIG{signum}"
69
- self.logger.debug(f"Received {signal_name}, shutting down telemetry...")
70
-
71
- self.shutdown(timeout=5.0) # Quick shutdown for signals
72
-
73
- # Let the original signal handler take over (or exit)
74
- if signum == signal.SIGINT:
75
- # Restore default handler and re-raise
76
- signal.signal(signal.SIGINT, signal.SIG_DFL)
77
- os.kill(os.getpid(), signal.SIGINT)
78
-
79
- def _atexit_handler(self):
80
- """Handle normal program exit"""
81
- self.logger.debug("Normal program exit, shutting down telemetry...")
82
- self.shutdown(timeout=10.0)
83
-
84
- @property
85
- def user_id(self) -> str:
86
- """Anonymous, persistent user ID"""
87
- if self._user_id:
88
- return self._user_id
89
-
90
- try:
91
- if not os.path.exists(self.USER_ID_PATH):
92
- os.makedirs(os.path.dirname(self.USER_ID_PATH), exist_ok=True)
93
- with open(self.USER_ID_PATH, "w") as f:
94
- new_user_id = str(uuid.uuid4())
95
- f.write(new_user_id)
96
- self._user_id = new_user_id
97
- else:
98
- with open(self.USER_ID_PATH, "r") as f:
99
- self._user_id = f.read().strip()
100
-
101
- return self._user_id
102
- except Exception as e:
103
- self.logger.debug(f"Error getting user ID: {e}")
104
- return "anonymous_user"
105
-
106
- def capture(self, event_name: str, properties: Optional[Dict[str, Any]] = None):
107
- """
108
- Safe event tracking that never affects library functionality
109
-
110
- Args:
111
- event_name: Event name (e.g. 'page_factory_used')
112
- properties: Event properties as dictionary
113
- """
114
- if not self.enabled or not self._client or self._is_shutdown:
115
- return
116
-
117
- try:
118
- # Add base properties
119
- event_properties = {
120
- "library": "notionary",
121
- "library_version": self._get_notionary_version(),
122
- **(properties or {}),
123
- }
124
-
125
- self._client.capture(
126
- distinct_id=self.user_id, event=event_name, properties=event_properties
127
- )
128
-
129
- except Exception:
130
- pass
131
-
132
- def flush(self, timeout: float = 5.0):
133
- """
134
- Flush events with timeout
135
-
136
- Args:
137
- timeout: Maximum time to wait for flush to complete
138
- """
139
- if not self.enabled or not self._client or self._is_shutdown:
140
- return
141
-
142
- try:
143
- # PostHog flush doesn't support timeout directly, so we do it in a thread
144
- flush_thread = threading.Thread(target=self._client.flush)
145
- flush_thread.daemon = True
146
- flush_thread.start()
147
- flush_thread.join(timeout=timeout)
148
-
149
- if flush_thread.is_alive():
150
- self.logger.warning(f"Telemetry flush timed out after {timeout}s")
151
- else:
152
- self.logger.debug("Telemetry events flushed successfully")
153
-
154
- except Exception as e:
155
- self.logger.debug(f"Error during telemetry flush: {e}")
156
-
157
- def shutdown(self, timeout: float = 10.0):
158
- """
159
- Clean shutdown of telemetry with timeout
160
-
161
- Args:
162
- timeout: Maximum time to wait for shutdown
163
- """
164
- with self._shutdown_lock:
165
- if self._is_shutdown:
166
- return
167
-
168
- self._is_shutdown = True
169
-
170
- try:
171
- if self._client:
172
- # First try to flush remaining events
173
- self.logger.debug("Flushing telemetry events before shutdown...")
174
- self.flush(timeout=timeout * 0.7) # Use 70% of timeout for flush
175
-
176
- # Then shutdown the client
177
- shutdown_thread = threading.Thread(target=self._client.shutdown)
178
- shutdown_thread.daemon = True
179
- shutdown_thread.start()
180
- shutdown_thread.join(timeout=timeout * 0.3) # Use 30% for shutdown
181
-
182
- if shutdown_thread.is_alive():
183
- self.logger.warning(f"Telemetry client shutdown timed out after {timeout}s")
184
- else:
185
- self.logger.debug("Telemetry client shut down successfully")
186
-
187
- except Exception as e:
188
- self.logger.debug(f"Error during telemetry shutdown: {e}")
189
- finally:
190
- self._client = None
191
-
192
- def _initialize_client(self):
193
- """Initializes PostHog client and shows startup message"""
194
- try:
195
- self._client = Posthog(
196
- project_api_key=self.PROJECT_API_KEY,
197
- host=self.HOST,
198
- disable_geoip=True,
199
- )
200
- if not self._logged_init_message:
201
- self.logger.info(
202
- "Anonymous telemetry enabled to improve Notionary. "
203
- "To disable: export ANONYMIZED_TELEMETRY=false"
204
- )
205
- self._logged_init_message = True
206
-
207
- self._track_initialization()
208
-
209
- except Exception as e:
210
- self.logger.debug(f"Telemetry initialization failed: {e}")
211
- self.enabled = False
212
- self._client = None
213
-
214
- def _track_initialization(self):
215
- """Tracks library initialization"""
216
- self.capture(
217
- "notionary_initialized",
218
- {
219
- "version": self._get_notionary_version(),
220
- },
221
- )
222
-
223
- def _get_notionary_version(self) -> str:
224
- """Determines the Notionary version"""
225
- import notionary
226
- return getattr(notionary, "__version__", "0.2.10")
@@ -1,76 +0,0 @@
1
- from functools import wraps
2
- from typing import Any, Callable, Dict, Optional
3
- from notionary.telemetry import NotionaryTelemetry
4
-
5
-
6
- def track_usage(event_name: Optional[str] = None, properties: Optional[Dict[str, Any]] = None):
7
- """
8
- Simple decorator to track function usage.
9
-
10
- Args:
11
- event_name: Custom event name (defaults to function name)
12
- properties: Additional properties to track
13
-
14
- Usage:
15
- @track_usage()
16
- def my_function():
17
- pass
18
-
19
- @track_usage('custom_event_name')
20
- def my_function():
21
- pass
22
-
23
- @track_usage('custom_event', {'feature': 'advanced'})
24
- def my_function():
25
- pass
26
- """
27
- def decorator(func: Callable) -> Callable:
28
- @wraps(func)
29
- def wrapper(*args, **kwargs):
30
- telemetry = NotionaryTelemetry()
31
-
32
- # Generate event name and properties
33
- event = event_name or _generate_event_name(func, args)
34
- event_properties = _build_properties(func, args, properties)
35
-
36
- # Track and execute
37
- telemetry.capture(event, event_properties)
38
- return func(*args, **kwargs)
39
-
40
- return wrapper
41
- return decorator
42
-
43
-
44
- def _get_class_name(func: Callable, args: tuple) -> Optional[str]:
45
- """Extract class name from function or arguments."""
46
- if args and hasattr(args[0], '__class__'):
47
- return args[0].__class__.__name__
48
-
49
- if hasattr(func, '__qualname__') and '.' in func.__qualname__:
50
- return func.__qualname__.split('.')[0]
51
-
52
- return None
53
-
54
-
55
- def _generate_event_name(func: Callable, args: tuple) -> str:
56
- """Generate event name from function and class info."""
57
- class_name = _get_class_name(func, args)
58
-
59
- if class_name:
60
- return f"{class_name.lower()}_{func.__name__}_used"
61
-
62
- return f"{func.__name__}_used"
63
-
64
-
65
- def _build_properties(func: Callable, args: tuple, properties: Optional[Dict[str, Any]]) -> Dict[str, Any]:
66
- """Build event properties with function and class info."""
67
- event_properties = {
68
- 'function_name': func.__name__,
69
- **(properties or {})
70
- }
71
-
72
- class_name = _get_class_name(func, args)
73
- if class_name:
74
- event_properties['class_name'] = class_name
75
-
76
- return event_properties
@@ -1,54 +0,0 @@
1
- import functools
2
- import inspect
3
- from typing import Callable, Any, TypeVar, cast
4
-
5
- F = TypeVar("F", bound=Callable[..., Any])
6
-
7
-
8
- def warn_direct_constructor_usage(func: F) -> F:
9
- """
10
- Method decorator that logs a warning when the constructor is called directly
11
- instead of through a factory method.
12
-
13
- This is an advisory decorator - it only logs a warning and doesn't
14
- prevent direct constructor usage.
15
- """
16
-
17
- @functools.wraps(func)
18
- def wrapper(self, *args, **kwargs):
19
- # Get the call stack
20
- stack = inspect.stack()
21
-
22
- self._from_factory = False
23
-
24
- search_depth = min(6, len(stack))
25
-
26
- for i in range(1, search_depth):
27
- if i >= len(stack):
28
- break
29
-
30
- caller_frame = stack[i]
31
- caller_name = caller_frame.function
32
-
33
- # Debug logging might be helpful during development
34
- # print(f"Frame {i}: {caller_name}")
35
-
36
- # If called from a factory method, mark it and break
37
- if caller_name.startswith("create_from_") or caller_name.startswith(
38
- "from_"
39
- ):
40
- self._from_factory = True
41
- break
42
-
43
- # If not from factory, log warning
44
- if not self._from_factory and hasattr(self, "logger"):
45
- self.logger.warning(
46
- "Advisory: Direct constructor usage is discouraged. "
47
- "Consider using factory methods like create_from_page_id(), "
48
- "create_from_url(), or create_from_page_name() instead."
49
- )
50
-
51
- # Call the original __init__
52
- return func(self, *args, **kwargs)
53
-
54
- return cast(F, wrapper)
@@ -1,70 +0,0 @@
1
- notionary/__init__.py,sha256=I4kPJ_LEy_IIQuBVGZ-U_kiIUWeRUP9DZ_F3w9BvS-4,809
2
- notionary/notion_client.py,sha256=gkREAr8LkUUKK9cOvq72r8jNjlXDleBP2fYm7LjjbjM,7311
3
- notionary/cli/main.py,sha256=GmUfdrJZjHYo689ZhrMuA4Lr_sBE2YeqrkFloXgrfvY,6663
4
- notionary/cli/onboarding.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- notionary/database/database_discovery.py,sha256=l9IjthwdA_Y_k_JXcAW-KnvZDwNYylIbsrQ5cpgtb5w,4484
6
- notionary/database/notion_database.py,sha256=yTGMK1EOuJDNiP6boc_dvWDLTTEhOOYa_ZdJWiOP19c,7695
7
- notionary/database/notion_database_factory.py,sha256=pOu4MDu7jaSkNQHk-TSEezsJ1pPGJXiSTOouygh2JuY,6783
8
- notionary/database/models/page_result.py,sha256=Vmm5_oYpYAkIIJVoTd1ZZGloeC3cmFLMYP255mAmtaw,233
9
- notionary/elements/audio_element.py,sha256=wXSo0DQs_KIVdLB-Ax5Yk4puW-_gFwAbJHcgcpwZjoA,5392
10
- notionary/elements/bookmark_element.py,sha256=bDJEMTLC1E3qUIjphFJC9l60ZAeJqZOWEvS__Y5Iq00,8192
11
- notionary/elements/bulleted_list_element.py,sha256=Ax6tIGtc92O57QKVWRKi2Sgkbmd6KqkSmssTcj17Tjg,2711
12
- notionary/elements/callout_element.py,sha256=w45gJogoqf4Z9aVqSq7toaU06IWWM_et5dCWywj_oeo,4539
13
- notionary/elements/code_block_element.py,sha256=PrsV58fzblmZz0vRkuAG2TT0kpiMglq0UlKaR-B-dJw,7576
14
- notionary/elements/column_element.py,sha256=yfWSLEClcxrWLteQClabaIvjay2h8krB6u5rfbnBRBI,12781
15
- notionary/elements/divider_element.py,sha256=bdGTgMgW8Uk6Fu7oy2UBrDaQ_2XiLzPNwF3JmrBS00I,2379
16
- notionary/elements/embed_element.py,sha256=QYyiKTbAM6COPqe61a3jSg6m2a4orUpA6l37lrn4-G0,4626
17
- notionary/elements/heading_element.py,sha256=XDO_hgiG-J2nVF3hwcpvsXte6uGDAAwyHx661lD-1H8,3215
18
- notionary/elements/image_element.py,sha256=agV8ZNwoJNOIvaJNARs2osdbe1T5MHPNbrzu7L19uRI,4805
19
- notionary/elements/mention_element.py,sha256=-8GbeaiGNglw5MZulomSa-hUh32HaZowAROeCgzMqdA,8274
20
- notionary/elements/notion_block_element.py,sha256=cou_87mAkj7U3LLU0kXJrbxVl8VusnlVBYYb4cchOPo,2603
21
- notionary/elements/numbered_list_element.py,sha256=iiDzjOwc5Fnv2RQsaTLeOtRVQdshG4rRQJa4LMJjCvY,2710
22
- notionary/elements/paragraph_element.py,sha256=EWUac9oq5zXso0svE5vTKNWlpq6sRdJxxVWYMEmYLz4,3302
23
- notionary/elements/qoute_element.py,sha256=cIa7S0G9Kb4qR5EXWOLJGPn0IzWm1zLujnzzO6t4-D0,6169
24
- notionary/elements/table_element.py,sha256=acIEoDz8tblj9pPmE5Gr0Ov-S9qJOTkEDNcUPBfsN4I,11296
25
- notionary/elements/text_inline_formatter.py,sha256=q1WePwTxhSkjhTFylcyAbhxaWLo_sjYS3Q_mIPgsKb4,8625
26
- notionary/elements/todo_element.py,sha256=r7H1KcEW7Iq6pQrhsPRBwHn_3ok26tR2fJf53U_kr5I,4171
27
- notionary/elements/toggle_element.py,sha256=caPT8wAo7ccwT2pzUzySrImnUlVB2cigFBGe32vwjJk,11129
28
- notionary/elements/toggleable_heading_element.py,sha256=mUzR1HrkOJEgzjIgVgtInvLoi4YzsPJ0pR3FO_OlD5U,10007
29
- notionary/elements/video_element.py,sha256=Y2JOvb4fovnY2nPAtTPSbdtk-HaRdWqg6RXr-_a2WOw,5774
30
- notionary/elements/registry/block_registry.py,sha256=g0id_Q6guzTyNY6HfnB9AjOBvCR4CvtpnUeFAY8kgY0,5027
31
- notionary/elements/registry/block_registry_builder.py,sha256=5zRKnw2102rAeHpANs6Csu4DVufOazf1peEovChWcgs,9572
32
- notionary/exceptions/database_exceptions.py,sha256=I-Tx6bYRLpi5pjGPtbT-Mqxvz3BFgYTiuZxknJeLxtI,2638
33
- notionary/exceptions/page_creation_exception.py,sha256=4v7IuZD6GsQLrqhDLriGjuG3ML638gAO53zDCrLePuU,281
34
- notionary/models/notion_block_response.py,sha256=gzL4C6K9QPcaMS6NbAZaRceSEnMbNwYBVVzxysza5VU,6002
35
- notionary/models/notion_database_response.py,sha256=FMAasQP20S12J_KMdMlNpcHHwxFKX2YtbE4Q9xn-ruQ,1213
36
- notionary/models/notion_page_response.py,sha256=r4fwMwwDocj92JdbSmyrzIqBKsnEaz4aDUiPabrg9BM,1762
37
- notionary/page/notion_page.py,sha256=CnEr5S425t7r8n4mZERwShlXsXnR2G7bbYjO8yb2oaU,18032
38
- notionary/page/notion_page_factory.py,sha256=p75yhr6FdYl9aG8Ttpf5pyuQiMJB0CAYMkfcVLI8HP0,12028
39
- notionary/page/notion_to_markdown_converter.py,sha256=vUQss0J7LUFLULGvW27PjaTFuWi8OsRQAUBowSYorkM,6408
40
- notionary/page/content/notion_page_content_chunker.py,sha256=kWJnV9GLU5YLgSVPKOjwMBbG_CMAmVRkuDtwJYb_UAA,3316
41
- notionary/page/content/page_content_retriever.py,sha256=MoRNwVyBacQEPFu-XseahKEFait0q8tjuhFUXHOBrMo,2208
42
- notionary/page/content/page_content_writer.py,sha256=PkH3i3sE8zbAUS8dtMbWHwKyq8yubuvzXCzeBZeUFKA,7436
43
- notionary/page/formatting/markdown_to_notion_converter.py,sha256=-CdGefHdeXtF3TyipOLkyrD6yFJbFDLmZMveoDiYBLo,17463
44
- notionary/page/formatting/spacer_rules.py,sha256=j2RHvdXT3HxXPVBEuCtulyy9cPxsEcOmj71pJqV-D3M,15677
45
- notionary/page/metadata/metadata_editor.py,sha256=0I-h5BbLpI_VbAobSdslK8G7TPWoHJb_fAPDtDEOc08,5116
46
- notionary/page/metadata/notion_icon_manager.py,sha256=_K23i1qsBW052ZuDez5X1l3S9zTRwkRoTnHnoeED98g,2562
47
- notionary/page/metadata/notion_page_cover_manager.py,sha256=2dQLw890gUGz2nEorAhGNkgLLQNlQKDa1VExABXiUOc,2201
48
- notionary/page/properites/database_property_service.py,sha256=RWNsze5bImUz4TXVReeFNtNSxlqOylEYS4EOL3bHxdQ,9895
49
- notionary/page/properites/page_property_manager.py,sha256=1Ga1Qf91yfxaLT55qNJuf5UMz9Z3-8xDZwEHptTqGdM,5729
50
- notionary/page/properites/property_formatter.py,sha256=k5yFPh87PX5yMaJqZiYjP2ZI8xbxXToYc6PMwNZ8Mpw,3653
51
- notionary/page/properites/property_value_extractor.py,sha256=5coK0-hSogSLeFL2P337ruGXuHHc447hP_Ry5niOI6M,2342
52
- notionary/page/relations/notion_page_relation_manager.py,sha256=PiwmOex8I4iR_9T8J0v_W58vS-E_BbTE1fsnnXD3nU4,11055
53
- notionary/page/relations/notion_page_title_resolver.py,sha256=LN89y-Tc0Rk81TiTeA5WsFqhittLLykdzn3x5Ok29YI,3561
54
- notionary/page/relations/page_database_relation.py,sha256=nkelofYzfuIFjmM7vR6IGJpWUG9XPmSDnU1WR8WtQrs,2231
55
- notionary/prompting/element_prompt_content.py,sha256=tHref-SKA81Ua_IQD2Km7y7BvFtHl74haSIjHNYE3FE,4403
56
- notionary/prompting/markdown_syntax_prompt_generator.py,sha256=_1qIYlqSfI6q6Fut10t6gGwTQuS8c3QBcC_5DBme9Mo,5084
57
- notionary/telemetry/__init__.py,sha256=qdFGrhOhUb_HPMLS4kLSr1BJNfb5-LzHwLmx-NYCDsw,156
58
- notionary/telemetry/telemetry.py,sha256=SEwEsegNhX7xblKnlk9qCDqKOTtf8sGtnNWbLiOVk7g,8182
59
- notionary/telemetry/track_usage_decorator.py,sha256=rmxwySb1PfZI1mXXU0G_W9Fpn6ByslYrDjsU4JYnMJ4,2421
60
- notionary/util/__init__.py,sha256=ra1jHFFiQNWYDzmVb81OVhtshzkZ0GcLVI8YDODYj3w,235
61
- notionary/util/logging_mixin.py,sha256=d5sRSmUtgQeuckdNBkO025IXPGe4oOb-7ueVAIP8amU,1846
62
- notionary/util/page_id_utils.py,sha256=EYNMxgf-7ghzL5K8lKZBZfW7g5CsdY0Xuj4IYmU8RPk,1381
63
- notionary/util/singleton.py,sha256=CKAvykndwPRZsA3n3MAY_XdCR59MBjjKP0vtm2BcvF0,428
64
- notionary/util/warn_direct_constructor_usage.py,sha256=vyJR73F95XVSRWIbyij-82IGOpAne9SBPM25eDpZfSU,1715
65
- notionary-0.2.12.dist-info/licenses/LICENSE,sha256=zOm3cRT1qD49eg7vgw95MI79rpUAZa1kRBFwL2FkAr8,1120
66
- notionary-0.2.12.dist-info/METADATA,sha256=vZNayJWGNmJAJBfitVjQXYEkJC2YjJRE0fmEK6s3Aeg,7582
67
- notionary-0.2.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
68
- notionary-0.2.12.dist-info/entry_points.txt,sha256=V7X21u3QNm7h7p6Cx0Sx2SO3mtmA7gVwXM8lNYnv9fk,54
69
- notionary-0.2.12.dist-info/top_level.txt,sha256=fhONa6BMHQXqthx5PanWGbPL0b8rdFqhrJKVLf_adSs,10
70
- notionary-0.2.12.dist-info/RECORD,,
File without changes