wappa 0.1.7__py3-none-any.whl → 0.1.9__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.
Potentially problematic release.
This version of wappa might be problematic. Click here for more details.
- wappa/cli/examples/init/.env.example +33 -0
- wappa/cli/examples/init/app/__init__.py +0 -0
- wappa/cli/examples/init/app/main.py +8 -0
- wappa/cli/examples/init/app/master_event.py +8 -0
- wappa/cli/examples/json_cache_example/.env.example +33 -0
- wappa/cli/examples/json_cache_example/app/__init__.py +1 -0
- wappa/cli/examples/json_cache_example/app/main.py +235 -0
- wappa/cli/examples/json_cache_example/app/master_event.py +419 -0
- wappa/cli/examples/json_cache_example/app/models/__init__.py +1 -0
- wappa/cli/examples/json_cache_example/app/models/json_demo_models.py +275 -0
- wappa/cli/examples/json_cache_example/app/scores/__init__.py +35 -0
- wappa/cli/examples/json_cache_example/app/scores/score_base.py +186 -0
- wappa/cli/examples/json_cache_example/app/scores/score_cache_statistics.py +248 -0
- wappa/cli/examples/json_cache_example/app/scores/score_message_history.py +190 -0
- wappa/cli/examples/json_cache_example/app/scores/score_state_commands.py +260 -0
- wappa/cli/examples/json_cache_example/app/scores/score_user_management.py +223 -0
- wappa/cli/examples/json_cache_example/app/utils/__init__.py +26 -0
- wappa/cli/examples/json_cache_example/app/utils/cache_utils.py +176 -0
- wappa/cli/examples/json_cache_example/app/utils/message_utils.py +246 -0
- wappa/cli/examples/openai_transcript/.gitignore +63 -4
- wappa/cli/examples/openai_transcript/app/__init__.py +0 -0
- wappa/cli/examples/openai_transcript/app/main.py +8 -0
- wappa/cli/examples/openai_transcript/app/master_event.py +53 -0
- wappa/cli/examples/openai_transcript/app/openai_utils/__init__.py +3 -0
- wappa/cli/examples/openai_transcript/app/openai_utils/audio_processing.py +76 -0
- wappa/cli/examples/redis_cache_example/.env.example +33 -0
- wappa/cli/examples/redis_cache_example/app/__init__.py +6 -0
- wappa/cli/examples/redis_cache_example/app/main.py +234 -0
- wappa/cli/examples/redis_cache_example/app/master_event.py +419 -0
- wappa/cli/examples/redis_cache_example/app/models/redis_demo_models.py +275 -0
- wappa/cli/examples/redis_cache_example/app/scores/__init__.py +35 -0
- wappa/cli/examples/redis_cache_example/app/scores/score_base.py +186 -0
- wappa/cli/examples/redis_cache_example/app/scores/score_cache_statistics.py +248 -0
- wappa/cli/examples/redis_cache_example/app/scores/score_message_history.py +190 -0
- wappa/cli/examples/redis_cache_example/app/scores/score_state_commands.py +260 -0
- wappa/cli/examples/redis_cache_example/app/scores/score_user_management.py +223 -0
- wappa/cli/examples/redis_cache_example/app/utils/__init__.py +26 -0
- wappa/cli/examples/redis_cache_example/app/utils/cache_utils.py +176 -0
- wappa/cli/examples/redis_cache_example/app/utils/message_utils.py +246 -0
- wappa/cli/examples/simple_echo_example/.env.example +33 -0
- wappa/cli/examples/simple_echo_example/app/__init__.py +7 -0
- wappa/cli/examples/simple_echo_example/app/main.py +183 -0
- wappa/cli/examples/simple_echo_example/app/master_event.py +209 -0
- wappa/cli/examples/wappa_full_example/.env.example +33 -0
- wappa/cli/examples/wappa_full_example/.gitignore +63 -4
- wappa/cli/examples/wappa_full_example/app/__init__.py +6 -0
- wappa/cli/examples/wappa_full_example/app/handlers/__init__.py +5 -0
- wappa/cli/examples/wappa_full_example/app/handlers/command_handlers.py +484 -0
- wappa/cli/examples/wappa_full_example/app/handlers/message_handlers.py +551 -0
- wappa/cli/examples/wappa_full_example/app/handlers/state_handlers.py +492 -0
- wappa/cli/examples/wappa_full_example/app/main.py +257 -0
- wappa/cli/examples/wappa_full_example/app/master_event.py +445 -0
- wappa/cli/examples/wappa_full_example/app/media/README.md +54 -0
- wappa/cli/examples/wappa_full_example/app/media/buttons/README.md +62 -0
- wappa/cli/examples/wappa_full_example/app/media/buttons/kitty.png +0 -0
- wappa/cli/examples/wappa_full_example/app/media/buttons/puppy.png +0 -0
- wappa/cli/examples/wappa_full_example/app/media/list/README.md +110 -0
- wappa/cli/examples/wappa_full_example/app/media/list/audio.mp3 +0 -0
- wappa/cli/examples/wappa_full_example/app/media/list/document.pdf +0 -0
- wappa/cli/examples/wappa_full_example/app/media/list/image.png +0 -0
- wappa/cli/examples/wappa_full_example/app/media/list/video.mp4 +0 -0
- wappa/cli/examples/wappa_full_example/app/models/__init__.py +5 -0
- wappa/cli/examples/wappa_full_example/app/models/state_models.py +425 -0
- wappa/cli/examples/wappa_full_example/app/models/user_models.py +287 -0
- wappa/cli/examples/wappa_full_example/app/models/webhook_metadata.py +301 -0
- wappa/cli/examples/wappa_full_example/app/utils/__init__.py +5 -0
- wappa/cli/examples/wappa_full_example/app/utils/cache_utils.py +483 -0
- wappa/cli/examples/wappa_full_example/app/utils/media_handler.py +473 -0
- wappa/cli/examples/wappa_full_example/app/utils/metadata_extractor.py +298 -0
- wappa/cli/main.py +8 -4
- wappa/core/config/settings.py +34 -2
- wappa/persistence/__init__.py +2 -2
- {wappa-0.1.7.dist-info → wappa-0.1.9.dist-info}/METADATA +1 -1
- {wappa-0.1.7.dist-info → wappa-0.1.9.dist-info}/RECORD +77 -13
- wappa/cli/examples/init/pyproject.toml +0 -7
- wappa/cli/examples/simple_echo_example/.python-version +0 -1
- wappa/cli/examples/simple_echo_example/pyproject.toml +0 -9
- {wappa-0.1.7.dist-info → wappa-0.1.9.dist-info}/WHEEL +0 -0
- {wappa-0.1.7.dist-info → wappa-0.1.9.dist-info}/entry_points.txt +0 -0
- {wappa-0.1.7.dist-info → wappa-0.1.9.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Metadata extraction utilities for webhook processing.
|
|
3
|
+
|
|
4
|
+
This module provides functions to extract comprehensive metadata from
|
|
5
|
+
IncomingMessageWebhook objects based on message type.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import time
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
from wappa.webhooks import IncomingMessageWebhook
|
|
12
|
+
|
|
13
|
+
from ..models.webhook_metadata import (
|
|
14
|
+
ContactMessageMetadata,
|
|
15
|
+
InteractiveMessageMetadata,
|
|
16
|
+
LocationMessageMetadata,
|
|
17
|
+
MediaMessageMetadata,
|
|
18
|
+
MessageType,
|
|
19
|
+
TextMessageMetadata,
|
|
20
|
+
UnknownMessageMetadata,
|
|
21
|
+
WebhookMetadata,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class MetadataExtractor:
|
|
26
|
+
"""Utility class for extracting metadata from webhooks."""
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def extract_metadata(webhook: IncomingMessageWebhook, start_time: float = None) -> WebhookMetadata:
|
|
30
|
+
"""
|
|
31
|
+
Extract appropriate metadata from webhook based on message type.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
webhook: IncomingMessageWebhook to extract metadata from
|
|
35
|
+
start_time: Optional start time for processing time calculation
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
WebhookMetadata object with extracted information
|
|
39
|
+
"""
|
|
40
|
+
# Calculate processing time if start_time provided
|
|
41
|
+
processing_time_ms = None
|
|
42
|
+
if start_time is not None:
|
|
43
|
+
processing_time_ms = int((time.time() - start_time) * 1000)
|
|
44
|
+
|
|
45
|
+
# Get message type from webhook
|
|
46
|
+
message_type_name = webhook.get_message_type_name().lower()
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
# Map message type string to enum
|
|
50
|
+
message_type = MessageType(message_type_name)
|
|
51
|
+
except ValueError:
|
|
52
|
+
# Handle unknown message types
|
|
53
|
+
return UnknownMessageMetadata.from_webhook(webhook, processing_time_ms)
|
|
54
|
+
|
|
55
|
+
# Extract metadata based on message type
|
|
56
|
+
if message_type == MessageType.TEXT:
|
|
57
|
+
return TextMessageMetadata.from_webhook(webhook, processing_time_ms)
|
|
58
|
+
|
|
59
|
+
elif message_type in [MessageType.IMAGE, MessageType.VIDEO, MessageType.AUDIO,
|
|
60
|
+
MessageType.VOICE, MessageType.DOCUMENT, MessageType.STICKER]:
|
|
61
|
+
return MediaMessageMetadata.from_webhook(webhook, message_type, processing_time_ms)
|
|
62
|
+
|
|
63
|
+
elif message_type == MessageType.LOCATION:
|
|
64
|
+
return LocationMessageMetadata.from_webhook(webhook, processing_time_ms)
|
|
65
|
+
|
|
66
|
+
elif message_type in [MessageType.CONTACT, MessageType.CONTACTS]:
|
|
67
|
+
return ContactMessageMetadata.from_webhook(webhook, processing_time_ms)
|
|
68
|
+
|
|
69
|
+
elif message_type == MessageType.INTERACTIVE:
|
|
70
|
+
return InteractiveMessageMetadata.from_webhook(webhook, processing_time_ms)
|
|
71
|
+
|
|
72
|
+
else:
|
|
73
|
+
# Fallback for unsupported types
|
|
74
|
+
return UnknownMessageMetadata.from_webhook(webhook, processing_time_ms)
|
|
75
|
+
|
|
76
|
+
@staticmethod
|
|
77
|
+
def format_metadata_for_user(metadata: WebhookMetadata) -> str:
|
|
78
|
+
"""
|
|
79
|
+
Format metadata for display to user.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
metadata: WebhookMetadata object to format
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Formatted string for user display
|
|
86
|
+
"""
|
|
87
|
+
lines = []
|
|
88
|
+
lines.append("📊 *Message Metadata*")
|
|
89
|
+
lines.append("─" * 30)
|
|
90
|
+
|
|
91
|
+
# Basic information
|
|
92
|
+
lines.append(f"🆔 Message ID: `{metadata.message_id[:20]}...`")
|
|
93
|
+
# Handle both enum and string values for message_type
|
|
94
|
+
message_type_str = metadata.message_type.value if hasattr(metadata.message_type, 'value') else str(metadata.message_type)
|
|
95
|
+
lines.append(f"📱 Message Type: `{message_type_str}`")
|
|
96
|
+
lines.append(f"👤 User: {metadata.user_name or metadata.user_id}")
|
|
97
|
+
lines.append(f"🕐 Timestamp: {metadata.timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
98
|
+
lines.append(f"🏢 Tenant: `{metadata.tenant_id}`")
|
|
99
|
+
lines.append(f"🌐 Platform: `{metadata.platform}`")
|
|
100
|
+
|
|
101
|
+
# Processing metadata
|
|
102
|
+
if metadata.processing_time_ms:
|
|
103
|
+
lines.append(f"⚡ Processing Time: {metadata.processing_time_ms}ms")
|
|
104
|
+
|
|
105
|
+
if metadata.cache_hit:
|
|
106
|
+
lines.append("💾 Cache: Hit ✅")
|
|
107
|
+
|
|
108
|
+
# Type-specific metadata
|
|
109
|
+
if isinstance(metadata, TextMessageMetadata):
|
|
110
|
+
lines.append("")
|
|
111
|
+
lines.append("📝 *Text Message Details:*")
|
|
112
|
+
lines.append(f"📏 Length: {metadata.text_length} characters")
|
|
113
|
+
if metadata.has_urls:
|
|
114
|
+
lines.append("🔗 Contains URLs: Yes")
|
|
115
|
+
if metadata.has_mentions:
|
|
116
|
+
lines.append("👥 Contains Mentions: Yes")
|
|
117
|
+
if metadata.is_forwarded:
|
|
118
|
+
lines.append("↪️ Forwarded: Yes")
|
|
119
|
+
|
|
120
|
+
elif isinstance(metadata, MediaMessageMetadata):
|
|
121
|
+
lines.append("")
|
|
122
|
+
lines.append(f"🎬 *{metadata.media_type.title()} Media Details:*")
|
|
123
|
+
lines.append(f"🆔 Media ID: `{metadata.media_id[:20]}...`")
|
|
124
|
+
if metadata.mime_type:
|
|
125
|
+
lines.append(f"📄 MIME Type: `{metadata.mime_type}`")
|
|
126
|
+
if metadata.file_size:
|
|
127
|
+
lines.append(f"📦 File Size: {MetadataExtractor._format_file_size(metadata.file_size)}")
|
|
128
|
+
if metadata.caption:
|
|
129
|
+
lines.append(f"💬 Caption: {metadata.caption[:50]}{'...' if len(metadata.caption) > 50 else ''}")
|
|
130
|
+
if metadata.width and metadata.height:
|
|
131
|
+
lines.append(f"📐 Dimensions: {metadata.width}x{metadata.height}")
|
|
132
|
+
if metadata.duration:
|
|
133
|
+
lines.append(f"⏱️ Duration: {metadata.duration}s")
|
|
134
|
+
if metadata.filename:
|
|
135
|
+
lines.append(f"📎 Filename: `{metadata.filename}`")
|
|
136
|
+
if metadata.is_forwarded:
|
|
137
|
+
lines.append("↪️ Forwarded: Yes")
|
|
138
|
+
|
|
139
|
+
elif isinstance(metadata, LocationMessageMetadata):
|
|
140
|
+
lines.append("")
|
|
141
|
+
lines.append("📍 *Location Details:*")
|
|
142
|
+
lines.append(f"🌍 Coordinates: {metadata.latitude}, {metadata.longitude}")
|
|
143
|
+
if metadata.location_name:
|
|
144
|
+
lines.append(f"🏷️ Name: {metadata.location_name}")
|
|
145
|
+
if metadata.location_address:
|
|
146
|
+
lines.append(f"🏠 Address: {metadata.location_address}")
|
|
147
|
+
if metadata.is_forwarded:
|
|
148
|
+
lines.append("↪️ Forwarded: Yes")
|
|
149
|
+
|
|
150
|
+
elif isinstance(metadata, ContactMessageMetadata):
|
|
151
|
+
lines.append("")
|
|
152
|
+
lines.append("👥 *Contact Details:*")
|
|
153
|
+
lines.append(f"📇 Contact Count: {metadata.contacts_count}")
|
|
154
|
+
if metadata.contact_names:
|
|
155
|
+
lines.append(f"👤 Names: {', '.join(metadata.contact_names[:3])}{'...' if len(metadata.contact_names) > 3 else ''}")
|
|
156
|
+
if metadata.has_phone_numbers:
|
|
157
|
+
lines.append("📞 Has Phone Numbers: Yes")
|
|
158
|
+
if metadata.has_emails:
|
|
159
|
+
lines.append("✉️ Has Emails: Yes")
|
|
160
|
+
if metadata.is_forwarded:
|
|
161
|
+
lines.append("↪️ Forwarded: Yes")
|
|
162
|
+
|
|
163
|
+
elif isinstance(metadata, InteractiveMessageMetadata):
|
|
164
|
+
lines.append("")
|
|
165
|
+
lines.append("🔘 *Interactive Details:*")
|
|
166
|
+
lines.append(f"⚡ Type: {metadata.interaction_type}")
|
|
167
|
+
lines.append(f"🆔 Selection ID: `{metadata.selection_id}`")
|
|
168
|
+
if metadata.selection_title:
|
|
169
|
+
lines.append(f"🏷️ Selection: {metadata.selection_title}")
|
|
170
|
+
if metadata.context_message_id:
|
|
171
|
+
lines.append(f"💬 Context Message: `{metadata.context_message_id[:20]}...`")
|
|
172
|
+
|
|
173
|
+
elif isinstance(metadata, UnknownMessageMetadata):
|
|
174
|
+
lines.append("")
|
|
175
|
+
lines.append("❓ *Unknown Message Type*")
|
|
176
|
+
lines.append("🔍 Raw data captured for debugging")
|
|
177
|
+
|
|
178
|
+
return "\n".join(lines)
|
|
179
|
+
|
|
180
|
+
@staticmethod
|
|
181
|
+
def get_metadata_summary(metadata: WebhookMetadata) -> dict:
|
|
182
|
+
"""
|
|
183
|
+
Get a summary of metadata for logging/analytics.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
metadata: WebhookMetadata object to summarize
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
Dictionary with metadata summary
|
|
190
|
+
"""
|
|
191
|
+
# Handle both enum and string values for message_type
|
|
192
|
+
message_type_value = metadata.message_type.value if hasattr(metadata.message_type, 'value') else str(metadata.message_type)
|
|
193
|
+
|
|
194
|
+
summary = {
|
|
195
|
+
"message_id": metadata.message_id,
|
|
196
|
+
"message_type": message_type_value,
|
|
197
|
+
"user_id": metadata.user_id,
|
|
198
|
+
"timestamp": metadata.timestamp.isoformat(),
|
|
199
|
+
"processing_time_ms": metadata.processing_time_ms,
|
|
200
|
+
"cache_hit": metadata.cache_hit
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
# Add type-specific summary data
|
|
204
|
+
if isinstance(metadata, TextMessageMetadata):
|
|
205
|
+
summary.update({
|
|
206
|
+
"text_length": metadata.text_length,
|
|
207
|
+
"has_urls": metadata.has_urls,
|
|
208
|
+
"has_mentions": metadata.has_mentions,
|
|
209
|
+
"is_forwarded": metadata.is_forwarded
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
elif isinstance(metadata, MediaMessageMetadata):
|
|
213
|
+
summary.update({
|
|
214
|
+
"media_id": metadata.media_id,
|
|
215
|
+
"media_type": metadata.media_type,
|
|
216
|
+
"file_size": metadata.file_size,
|
|
217
|
+
"has_caption": bool(metadata.caption),
|
|
218
|
+
"is_forwarded": metadata.is_forwarded
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
elif isinstance(metadata, LocationMessageMetadata):
|
|
222
|
+
summary.update({
|
|
223
|
+
"latitude": metadata.latitude,
|
|
224
|
+
"longitude": metadata.longitude,
|
|
225
|
+
"has_name": bool(metadata.location_name),
|
|
226
|
+
"has_address": bool(metadata.location_address),
|
|
227
|
+
"is_forwarded": metadata.is_forwarded
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
elif isinstance(metadata, ContactMessageMetadata):
|
|
231
|
+
summary.update({
|
|
232
|
+
"contacts_count": metadata.contacts_count,
|
|
233
|
+
"has_phone_numbers": metadata.has_phone_numbers,
|
|
234
|
+
"has_emails": metadata.has_emails,
|
|
235
|
+
"is_forwarded": metadata.is_forwarded
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
elif isinstance(metadata, InteractiveMessageMetadata):
|
|
239
|
+
summary.update({
|
|
240
|
+
"interaction_type": metadata.interaction_type,
|
|
241
|
+
"selection_id": metadata.selection_id,
|
|
242
|
+
"has_title": bool(metadata.selection_title)
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
return summary
|
|
246
|
+
|
|
247
|
+
@staticmethod
|
|
248
|
+
def _format_file_size(size_bytes: int) -> str:
|
|
249
|
+
"""Format file size in human-readable format."""
|
|
250
|
+
if size_bytes < 1024:
|
|
251
|
+
return f"{size_bytes} B"
|
|
252
|
+
elif size_bytes < 1024 * 1024:
|
|
253
|
+
return f"{size_bytes / 1024:.1f} KB"
|
|
254
|
+
elif size_bytes < 1024 * 1024 * 1024:
|
|
255
|
+
return f"{size_bytes / (1024 * 1024):.1f} MB"
|
|
256
|
+
else:
|
|
257
|
+
return f"{size_bytes / (1024 * 1024 * 1024):.1f} GB"
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
# Convenience functions for direct use
|
|
261
|
+
def extract_webhook_metadata(webhook: IncomingMessageWebhook, start_time: float = None) -> WebhookMetadata:
|
|
262
|
+
"""
|
|
263
|
+
Extract metadata from webhook (convenience function).
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
webhook: IncomingMessageWebhook to process
|
|
267
|
+
start_time: Optional start time for processing measurement
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
WebhookMetadata object
|
|
271
|
+
"""
|
|
272
|
+
return MetadataExtractor.extract_metadata(webhook, start_time)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def format_metadata_message(metadata: WebhookMetadata) -> str:
|
|
276
|
+
"""
|
|
277
|
+
Format metadata for user display (convenience function).
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
metadata: WebhookMetadata to format
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
Formatted string for user
|
|
284
|
+
"""
|
|
285
|
+
return MetadataExtractor.format_metadata_for_user(metadata)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def get_processing_summary(metadata: WebhookMetadata) -> dict:
|
|
289
|
+
"""
|
|
290
|
+
Get processing summary (convenience function).
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
metadata: WebhookMetadata to summarize
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
Summary dictionary
|
|
297
|
+
"""
|
|
298
|
+
return MetadataExtractor.get_metadata_summary(metadata)
|
wappa/cli/main.py
CHANGED
|
@@ -127,7 +127,7 @@ def _initialize_project(directory: str) -> None:
|
|
|
127
127
|
try:
|
|
128
128
|
# Create directory structure
|
|
129
129
|
(project_path / "app").mkdir(exist_ok=True)
|
|
130
|
-
(project_path / "scores").mkdir(exist_ok=True)
|
|
130
|
+
(project_path / "app" / "scores").mkdir(exist_ok=True)
|
|
131
131
|
|
|
132
132
|
typer.echo("📁 Created directory structure")
|
|
133
133
|
|
|
@@ -136,7 +136,7 @@ def _initialize_project(directory: str) -> None:
|
|
|
136
136
|
"app/__init__.py": "__init__.py.template",
|
|
137
137
|
"app/main.py": "main.py.template",
|
|
138
138
|
"app/master_event.py": "master_event.py.template",
|
|
139
|
-
"scores/__init__.py": "__init__.py.template",
|
|
139
|
+
"app/scores/__init__.py": "__init__.py.template",
|
|
140
140
|
".gitignore": "gitignore.template",
|
|
141
141
|
".env": "env.template",
|
|
142
142
|
}
|
|
@@ -493,13 +493,17 @@ def _copy_example(example_key: str, target_directory: str) -> None:
|
|
|
493
493
|
|
|
494
494
|
console.print(f"🚀 Copying {EXAMPLES[example_key]['name']} to {target_path}")
|
|
495
495
|
|
|
496
|
-
# Copy all files from the example
|
|
496
|
+
# Copy all files from the example (including hidden files, excluding .git and __pycache__)
|
|
497
497
|
for item in source_path.iterdir():
|
|
498
|
+
# Skip .git and __pycache__ directories
|
|
499
|
+
if item.name in {'.git', '__pycache__'}:
|
|
500
|
+
continue
|
|
501
|
+
|
|
498
502
|
if item.is_file():
|
|
499
503
|
shutil.copy2(item, target_path / item.name)
|
|
500
504
|
console.print(f"📝 Copied: {item.name}")
|
|
501
505
|
elif item.is_dir():
|
|
502
|
-
shutil.copytree(item, target_path / item.name, dirs_exist_ok=True)
|
|
506
|
+
shutil.copytree(item, target_path / item.name, dirs_exist_ok=True, ignore=shutil.ignore_patterns('__pycache__', '*.pyc'))
|
|
503
507
|
console.print(f"📁 Copied: {item.name}/")
|
|
504
508
|
|
|
505
509
|
console.print("\n✅ Example copied successfully!")
|
wappa/core/config/settings.py
CHANGED
|
@@ -5,6 +5,7 @@ Simple, reliable environment variable configuration focused on core WhatsApp fun
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import os
|
|
8
|
+
import sys
|
|
8
9
|
import tomllib
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
|
|
@@ -41,6 +42,34 @@ def _get_version_from_pyproject() -> str:
|
|
|
41
42
|
return "0.1.0"
|
|
42
43
|
|
|
43
44
|
|
|
45
|
+
def _is_cli_context() -> bool:
|
|
46
|
+
"""
|
|
47
|
+
Detect if we're running in CLI context (help, init, examples) vs server context (dev, prod).
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
True if running CLI commands that don't need WhatsApp credentials
|
|
51
|
+
"""
|
|
52
|
+
# Check command line arguments
|
|
53
|
+
if len(sys.argv) > 1:
|
|
54
|
+
# Direct CLI commands that don't need credentials
|
|
55
|
+
cli_only_commands = {"--help", "-h", "init", "examples"}
|
|
56
|
+
|
|
57
|
+
# Check for help flag or CLI-only commands
|
|
58
|
+
for arg in sys.argv[1:]:
|
|
59
|
+
if arg in cli_only_commands:
|
|
60
|
+
return True
|
|
61
|
+
|
|
62
|
+
# Check if we're running wappa command directly (not through uvicorn)
|
|
63
|
+
if any("wappa" in arg for arg in sys.argv):
|
|
64
|
+
# If no server commands (dev/prod) are present, assume CLI context
|
|
65
|
+
server_commands = {"dev", "prod"}
|
|
66
|
+
has_server_command = any(cmd in sys.argv for cmd in server_commands)
|
|
67
|
+
if not has_server_command:
|
|
68
|
+
return True
|
|
69
|
+
|
|
70
|
+
return False
|
|
71
|
+
|
|
72
|
+
|
|
44
73
|
class Settings:
|
|
45
74
|
"""Application settings with environment-based configuration."""
|
|
46
75
|
|
|
@@ -98,9 +127,12 @@ class Settings:
|
|
|
98
127
|
# Development/Production detection
|
|
99
128
|
self.environment: str = os.getenv("ENVIRONMENT", "DEV")
|
|
100
129
|
|
|
101
|
-
# Apply validation
|
|
130
|
+
# Apply validation (skip WhatsApp validation for CLI-only commands)
|
|
102
131
|
self._validate_settings()
|
|
103
|
-
|
|
132
|
+
|
|
133
|
+
# Only validate WhatsApp credentials for server operations
|
|
134
|
+
if not _is_cli_context():
|
|
135
|
+
self._validate_whatsapp_credentials()
|
|
104
136
|
|
|
105
137
|
def _validate_settings(self):
|
|
106
138
|
"""Validate settings values."""
|
wappa/persistence/__init__.py
CHANGED
|
@@ -24,7 +24,7 @@ from .cache_factory import create_cache_factory, get_cache_factory
|
|
|
24
24
|
|
|
25
25
|
# Cache Interfaces
|
|
26
26
|
from ..domain.interfaces.cache_factory import ICacheFactory
|
|
27
|
-
from ..domain.interfaces.cache_interface import
|
|
27
|
+
from ..domain.interfaces.cache_interface import ICache
|
|
28
28
|
from ..domain.interfaces.state_repository import IStateRepository
|
|
29
29
|
from ..domain.interfaces.user_repository import IUserRepository
|
|
30
30
|
from ..domain.interfaces.tables_repository import ITablesRepository
|
|
@@ -42,7 +42,7 @@ __all__ = [
|
|
|
42
42
|
|
|
43
43
|
# Core Interfaces
|
|
44
44
|
"ICacheFactory",
|
|
45
|
-
"
|
|
45
|
+
"ICache",
|
|
46
46
|
"IRepositoryFactory",
|
|
47
47
|
|
|
48
48
|
# Repository Interfaces
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wappa
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.9
|
|
4
4
|
Summary: Open Source Framework to develop smart Workflows, Agents and full chat applications through WhatsApp
|
|
5
5
|
Project-URL: Homepage, https://wappa.mimeia.com
|
|
6
6
|
Project-URL: Documentation, https://wappa.mimeia.com/docs
|
|
@@ -20,27 +20,91 @@ wappa/api/routes/whatsapp/whatsapp_messages.py,sha256=_CM_HDtrvC4HOk1Mhv4nvkTPNq
|
|
|
20
20
|
wappa/api/routes/whatsapp/whatsapp_specialized.py,sha256=O5yYq5omYkEzGoB5hPsAbM1xUQ0ZEz2AO0i71PTSGag,18509
|
|
21
21
|
wappa/api/routes/whatsapp/whatsapp_templates.py,sha256=xx-UvuOFDtADUbXrwsSEc-I9u2w_jHqlUO-9ZN1uIdY,15371
|
|
22
22
|
wappa/cli/__init__.py,sha256=IAcBraY6UIX5UE2gUcMZBDrPS2CRxd84eVR3IMI8S14,148
|
|
23
|
-
wappa/cli/main.py,sha256
|
|
23
|
+
wappa/cli/main.py,sha256=RHNmOvbX-PF4cK55UrLzbZBbPpVp-NpaM_F35qurB9g,18469
|
|
24
|
+
wappa/cli/examples/init/.env.example,sha256=MFtwavWncye8qvhCSGdGQ6kunNRVf1WNNgnA9shFCZ4,746
|
|
24
25
|
wappa/cli/examples/init/.gitignore,sha256=QHovONB4wk9fp23oqg80JdChM7UWs4mfmtpN5ZrORNc,574
|
|
25
|
-
wappa/cli/examples/init/
|
|
26
|
+
wappa/cli/examples/init/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
|
+
wappa/cli/examples/init/app/main.py,sha256=v0Ep5Au3SmFo9NxfcuGCSfT7IZSGJX6vz_d1qTmm8cI,169
|
|
28
|
+
wappa/cli/examples/init/app/master_event.py,sha256=0cCDZlJ1aa-y4QRK6ImD64KyGltAXdYDQz9d2RV9QsY,379
|
|
29
|
+
wappa/cli/examples/json_cache_example/.env.example,sha256=MFtwavWncye8qvhCSGdGQ6kunNRVf1WNNgnA9shFCZ4,746
|
|
26
30
|
wappa/cli/examples/json_cache_example/.gitignore,sha256=QHovONB4wk9fp23oqg80JdChM7UWs4mfmtpN5ZrORNc,574
|
|
27
31
|
wappa/cli/examples/json_cache_example/README.md,sha256=Sa2gUpOeLFaU3oeLX97AFLJ42bmXiu6StyHtZ30wERk,6240
|
|
28
|
-
wappa/cli/examples/
|
|
32
|
+
wappa/cli/examples/json_cache_example/app/__init__.py,sha256=Zj1E_qslVEJXN4J28UKbq-yS6zKMQuCDrnl34ICzyrM,60
|
|
33
|
+
wappa/cli/examples/json_cache_example/app/main.py,sha256=Ili5pVDSc2qiO7soQ0EZJIKo2zbsV-GxStyL9iKyFu0,8838
|
|
34
|
+
wappa/cli/examples/json_cache_example/app/master_event.py,sha256=oYjSzmt-Cp629j4m5YSm_q3sThK8wYKnCsYfjUkaJLM,17456
|
|
35
|
+
wappa/cli/examples/json_cache_example/app/models/__init__.py,sha256=u6SMNzALf1NNXmKIBSut3hDOOyzp2DYIFtfMFT_yZBA,40
|
|
36
|
+
wappa/cli/examples/json_cache_example/app/models/json_demo_models.py,sha256=4067RlEkiTfiXSCZql9Q-sNSiZyRx26PTHoO9uH_2kk,8065
|
|
37
|
+
wappa/cli/examples/json_cache_example/app/scores/__init__.py,sha256=9yA3sMd4uU3t_vWR6OYBMIOf0rZUkcsLx7ki2VGyDUQ,1081
|
|
38
|
+
wappa/cli/examples/json_cache_example/app/scores/score_base.py,sha256=qd_NfZacxX7XcgeiOAyoOVZLYksvHqLbj0GoJwnsl3s,5838
|
|
39
|
+
wappa/cli/examples/json_cache_example/app/scores/score_cache_statistics.py,sha256=vkjfEcpRqAg52U2XQQVTzHBZ3JmABg2_4tL9gMHkF-0,9795
|
|
40
|
+
wappa/cli/examples/json_cache_example/app/scores/score_message_history.py,sha256=iYASzRtwy-6O_6wFtK42wJdZjiqUFrF3fmz2Q_QXswg,6837
|
|
41
|
+
wappa/cli/examples/json_cache_example/app/scores/score_state_commands.py,sha256=gbg1e_0D4NENiGr1fv_4b-_czmnR-MD3zYrXGLqhx_Y,9870
|
|
42
|
+
wappa/cli/examples/json_cache_example/app/scores/score_user_management.py,sha256=klLATgExomqoZqkZK2KfWZTc7-aniXvC9Zo-54z2TBw,8404
|
|
43
|
+
wappa/cli/examples/json_cache_example/app/utils/__init__.py,sha256=Sk_Edbxi5kO4mIHeka6VFpDbHON09GDDFJCGuaOqmoM,541
|
|
44
|
+
wappa/cli/examples/json_cache_example/app/utils/cache_utils.py,sha256=WCiLGoCun-ozxlrq07CfqQo41ynivClIssmY46V-AHE,5196
|
|
45
|
+
wappa/cli/examples/json_cache_example/app/utils/message_utils.py,sha256=wHW_XK--pLBKqaRWFuPdlZEy8BwKk6hn02mYMOivdgU,7310
|
|
46
|
+
wappa/cli/examples/openai_transcript/.gitignore,sha256=QHovONB4wk9fp23oqg80JdChM7UWs4mfmtpN5ZrORNc,574
|
|
29
47
|
wappa/cli/examples/openai_transcript/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
+
wappa/cli/examples/openai_transcript/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
wappa/cli/examples/openai_transcript/app/main.py,sha256=lObR1r_W8jF054nrv55dIoK4oPWjFt81Zvk30P2wgxA,177
|
|
50
|
+
wappa/cli/examples/openai_transcript/app/master_event.py,sha256=KcoWSkHKUjraqslNbkzdzV5fJRWwKQpk1dFaQ9k0lE0,2617
|
|
51
|
+
wappa/cli/examples/openai_transcript/app/openai_utils/__init__.py,sha256=RoxD5Qpyy-FyLKdBnQEjpobb1Rj1t8REvCyC1YU3R7I,86
|
|
52
|
+
wappa/cli/examples/openai_transcript/app/openai_utils/audio_processing.py,sha256=tN4ACy7rQToapOF1g6R-AqLgAgHmx-Fz2NHWJFk6QsE,3294
|
|
53
|
+
wappa/cli/examples/redis_cache_example/.env.example,sha256=XfLfh17WO_7LBn5VEr_4dXcsD_UGT5LHeK3FIhHU9yw,742
|
|
30
54
|
wappa/cli/examples/redis_cache_example/.gitignore,sha256=QHovONB4wk9fp23oqg80JdChM7UWs4mfmtpN5ZrORNc,574
|
|
31
55
|
wappa/cli/examples/redis_cache_example/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
+
wappa/cli/examples/redis_cache_example/app/__init__.py,sha256=K2M48HHnqSNpk6aKxO9llvuqVTVnVFxomANkSHt9Xso,181
|
|
57
|
+
wappa/cli/examples/redis_cache_example/app/main.py,sha256=zVoRI7Hf4V117oCOpz6Bjff08fXDsBH2HgA3TPGQsm4,8502
|
|
58
|
+
wappa/cli/examples/redis_cache_example/app/master_event.py,sha256=LfaMqEo1ChBWsWqCRaA92dYzfQtSaB2Ck2hT8rCfOJE,17462
|
|
59
|
+
wappa/cli/examples/redis_cache_example/app/models/redis_demo_models.py,sha256=_1CFt62JsxHbjRM_aBYiydTni5h49ju2RZwPymje_6o,8067
|
|
60
|
+
wappa/cli/examples/redis_cache_example/app/scores/__init__.py,sha256=_yZ1ko4-JlIAR1_qbMbzE_1PUyfcGwTQimbWBeP-zx0,1082
|
|
61
|
+
wappa/cli/examples/redis_cache_example/app/scores/score_base.py,sha256=qd_NfZacxX7XcgeiOAyoOVZLYksvHqLbj0GoJwnsl3s,5838
|
|
62
|
+
wappa/cli/examples/redis_cache_example/app/scores/score_cache_statistics.py,sha256=Bvja9NHlfjjgAJFdaFYvCkM7ZfZfQ4I0Xz9I_qCHfIU,9836
|
|
63
|
+
wappa/cli/examples/redis_cache_example/app/scores/score_message_history.py,sha256=kxsw-kj6tuIooU53GZmOMCnKCgJ5CvNpeyX1VWBu1-A,6833
|
|
64
|
+
wappa/cli/examples/redis_cache_example/app/scores/score_state_commands.py,sha256=0HAXgA6Xh5D5Imz15fRXgn0OKbh0Uc9wLAnkjNPv868,9867
|
|
65
|
+
wappa/cli/examples/redis_cache_example/app/scores/score_user_management.py,sha256=hkZ3D4K3WxtuORsrzg0rLZI8eT95Q1Ov0rxbHRF_CEc,8396
|
|
66
|
+
wappa/cli/examples/redis_cache_example/app/utils/__init__.py,sha256=Sk_Edbxi5kO4mIHeka6VFpDbHON09GDDFJCGuaOqmoM,541
|
|
67
|
+
wappa/cli/examples/redis_cache_example/app/utils/cache_utils.py,sha256=WCiLGoCun-ozxlrq07CfqQo41ynivClIssmY46V-AHE,5196
|
|
68
|
+
wappa/cli/examples/redis_cache_example/app/utils/message_utils.py,sha256=wHW_XK--pLBKqaRWFuPdlZEy8BwKk6hn02mYMOivdgU,7310
|
|
69
|
+
wappa/cli/examples/simple_echo_example/.env.example,sha256=XfLfh17WO_7LBn5VEr_4dXcsD_UGT5LHeK3FIhHU9yw,742
|
|
32
70
|
wappa/cli/examples/simple_echo_example/.gitignore,sha256=QHovONB4wk9fp23oqg80JdChM7UWs4mfmtpN5ZrORNc,574
|
|
33
|
-
wappa/cli/examples/simple_echo_example/.python-version,sha256=e1X45ntWI8S-8_ppEojalDfXnTq6FW3kjUgdsyrH0W0,5
|
|
34
71
|
wappa/cli/examples/simple_echo_example/README.md,sha256=cuQfzmHaNM4C6_VQDjnHB3No6zAiDOPBTcAWBneI6Kc,4486
|
|
35
|
-
wappa/cli/examples/simple_echo_example/
|
|
72
|
+
wappa/cli/examples/simple_echo_example/app/__init__.py,sha256=4a_vkSCD8fjzxPpc_CZRxBauyn4EF2ddAUd5SdL2IPg,218
|
|
73
|
+
wappa/cli/examples/simple_echo_example/app/main.py,sha256=2j6P4kdRh7-mumuyAsDMDq-RANPYqK23i30wTTRCrnM,5685
|
|
74
|
+
wappa/cli/examples/simple_echo_example/app/master_event.py,sha256=fZ_9lyzn8M1t0ZTu_LwHDq_NQVPeS8XZDBlW1vDcXrQ,8210
|
|
36
75
|
wappa/cli/examples/wappa_full_example/.dockerignore,sha256=xmyhzrl7nBHRABH06D2Imt3rZ1OXSaBmCj_a15JiCrA,1974
|
|
37
|
-
wappa/cli/examples/wappa_full_example/.
|
|
76
|
+
wappa/cli/examples/wappa_full_example/.env.example,sha256=XfLfh17WO_7LBn5VEr_4dXcsD_UGT5LHeK3FIhHU9yw,742
|
|
77
|
+
wappa/cli/examples/wappa_full_example/.gitignore,sha256=QHovONB4wk9fp23oqg80JdChM7UWs4mfmtpN5ZrORNc,574
|
|
38
78
|
wappa/cli/examples/wappa_full_example/Dockerfile,sha256=aRMbPhxkjpOEINgdC7GK_PQvrdFUKPoWDFNQG48VVDE,2781
|
|
39
79
|
wappa/cli/examples/wappa_full_example/RAILWAY_DEPLOYMENT.md,sha256=2Yo4RpCg_JuVYeKP7aFbsg74bEHmAAkblMKwf_Vfqvs,7602
|
|
40
80
|
wappa/cli/examples/wappa_full_example/README.md,sha256=TjPajI52_9nqgpw0-do0-Fm78wL2iNTr4ZgLibnQIsA,10283
|
|
41
81
|
wappa/cli/examples/wappa_full_example/docker-compose.yml,sha256=aVPUzQAzp4Mde80VzS3tOLwUr4zm50pPkWi8JVlDAjg,4613
|
|
42
82
|
wappa/cli/examples/wappa_full_example/nginx.conf,sha256=4dGnf4_QnxyizzsWx3KWCf9X2GKSe8X4XGxhcR12MxE,6134
|
|
43
83
|
wappa/cli/examples/wappa_full_example/railway.toml,sha256=QcGF8H65jFVcsQMIR4erfqS9krmfvoSKyXtnsCCzcqo,1030
|
|
84
|
+
wappa/cli/examples/wappa_full_example/app/__init__.py,sha256=1iMMamjH2stZfcCKmnMqV03RrD0ZEjtjNbPNpVq4_gc,201
|
|
85
|
+
wappa/cli/examples/wappa_full_example/app/main.py,sha256=L-bUcrq6mMvMi0A2oYPuk1ymTw3lKo-cmCaoBaVblQU,9763
|
|
86
|
+
wappa/cli/examples/wappa_full_example/app/master_event.py,sha256=s4aTNPmAbVNwZ5C1uHkY6KlL7LjjMmSpLJEPTrvRlyU,19981
|
|
87
|
+
wappa/cli/examples/wappa_full_example/app/handlers/__init__.py,sha256=gofWlv2vlmtTwLljjrYCuxrp0995BFzPpYXhccKpGKU,166
|
|
88
|
+
wappa/cli/examples/wappa_full_example/app/handlers/command_handlers.py,sha256=YBBOfUTfADkDwelIhS6xFjR-xciSfzRj2aDdnkQjx68,19960
|
|
89
|
+
wappa/cli/examples/wappa_full_example/app/handlers/message_handlers.py,sha256=gnCZM-sL-jeAY198JRi5wIrHPsUBkjZyMxRRd9_RM5U,22817
|
|
90
|
+
wappa/cli/examples/wappa_full_example/app/handlers/state_handlers.py,sha256=aj_lCuWjAfBzSEl24Br3jgBEJv6ZZdbT0WJXFtpHU9E,20443
|
|
91
|
+
wappa/cli/examples/wappa_full_example/app/media/README.md,sha256=r0xGsUxouTKv5I8bDE_A7RTrFc4m9jD5vm01Mu6JLes,1984
|
|
92
|
+
wappa/cli/examples/wappa_full_example/app/media/buttons/README.md,sha256=tR1BEJelo8Jv5cPNJB7-z3twNGLEhaU0fuLEccRyw6Y,1689
|
|
93
|
+
wappa/cli/examples/wappa_full_example/app/media/buttons/kitty.png,sha256=5PwFKWNwdP0QXeBu9LmxfRIMQcRfM7xXU_ScddVZ3p0,2918957
|
|
94
|
+
wappa/cli/examples/wappa_full_example/app/media/buttons/puppy.png,sha256=H9n1fk1nXfdLzNmWxvuTh9u6SRrfYNi3TQxHP6zfh9s,2621581
|
|
95
|
+
wappa/cli/examples/wappa_full_example/app/media/list/README.md,sha256=JNKCwXGNAgNrng-xhC4WCSb0VSTc0IRarHVLNqN0ehM,3661
|
|
96
|
+
wappa/cli/examples/wappa_full_example/app/media/list/audio.mp3,sha256=GPWSYW8Hn-Cc9WXFB8oV99tVzjIm2elXMgmdc5qNFmk,200619
|
|
97
|
+
wappa/cli/examples/wappa_full_example/app/media/list/document.pdf,sha256=9BbGU8MRI3R93qVRDrsvu9T23PhyfD6Kj5tbiQw7DXE,147162
|
|
98
|
+
wappa/cli/examples/wappa_full_example/app/media/list/image.png,sha256=YDyPnnOG_BLD70kG-6h5CVj4uPDQ2Qvmfl2HEE0tCow,100521
|
|
99
|
+
wappa/cli/examples/wappa_full_example/app/media/list/video.mp4,sha256=pVDzWKCxvfYPkRFEbk3IU8NGCIrqCDvhBPLEB0xyJFE,1655191
|
|
100
|
+
wappa/cli/examples/wappa_full_example/app/models/__init__.py,sha256=PR-yPzlAjzqyzvYPnc81ogu97yFY_ZXx8JYc_CKxn7s,141
|
|
101
|
+
wappa/cli/examples/wappa_full_example/app/models/state_models.py,sha256=zLNAP1cF95_qi0Z1fd2c5DWibbJNI_bJRnfR_wjtN2s,15061
|
|
102
|
+
wappa/cli/examples/wappa_full_example/app/models/user_models.py,sha256=5zUmrY8vqmV_pL3Jw8m5t-l4TBLHVE9-qVINMP1VORU,10911
|
|
103
|
+
wappa/cli/examples/wappa_full_example/app/models/webhook_metadata.py,sha256=PNnRqd7E1Jj8vN6HJV-IgVelOInyrfIaeo55xlsgoYA,11354
|
|
104
|
+
wappa/cli/examples/wappa_full_example/app/utils/__init__.py,sha256=Ud6emdpWO17cueQJaUlAsR7rEe9UgLy2Ll-2xUzmW5w,146
|
|
105
|
+
wappa/cli/examples/wappa_full_example/app/utils/cache_utils.py,sha256=OrFj-NtRVrvfFvwMjdf1p-Lat0XtMhqobi8wTyD5g3M,15983
|
|
106
|
+
wappa/cli/examples/wappa_full_example/app/utils/media_handler.py,sha256=y3f8Aonu6wd2yKe-H7Gn6dy10D2liPZFRDQmJGY7ETs,16697
|
|
107
|
+
wappa/cli/examples/wappa_full_example/app/utils/metadata_extractor.py,sha256=JBJdFt-jSu2rIncYcj4GyckeA35-txD2CeKQ53e800M,11989
|
|
44
108
|
wappa/cli/templates/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
109
|
wappa/cli/templates/env.template,sha256=NnFFQ6QDZkHq5t3sPET6X0cLYi403IHe-sfh1Y-FbCY,734
|
|
46
110
|
wappa/cli/templates/gitignore.template,sha256=WQ1DBB8_-oI20xwAzfhTGGF2CWCW0QGLLwwd_FNyzdo,3107
|
|
@@ -50,7 +114,7 @@ wappa/core/__init__.py,sha256=6Lv3p4P9yy7Lb3hol5pILM8AX-IHlVa-u8xiyBi_eQk,1824
|
|
|
50
114
|
wappa/core/types.py,sha256=ez9aAXpD2D6GT7uNhw17XlZbQU_PYTcvGpWleAKEe24,2743
|
|
51
115
|
wappa/core/wappa_app.py,sha256=0gmDdQr5-NZyEvFnHUHyZB_51RSl3nM57BMacey8GbY,18956
|
|
52
116
|
wappa/core/config/__init__.py,sha256=rLVdjj9dAvDaa2lCf-UgGPCZ7YODCWIkB9PcSCl4NgE,104
|
|
53
|
-
wappa/core/config/settings.py,sha256=
|
|
117
|
+
wappa/core/config/settings.py,sha256=f_E5MYttSP8-MaycQC4ULZCbrprmGT5K3tXzeuRqWMA,7420
|
|
54
118
|
wappa/core/events/__init__.py,sha256=ju2xxhyouJ0efgQcG40_zb_CHzSLj6v0isLJUK5MQHM,1058
|
|
55
119
|
wappa/core/events/default_handlers.py,sha256=4I_PWOT0JBmq5a8OsSE6CkpNaXAt6uuFp2gpcyPZrpU,23669
|
|
56
120
|
wappa/core/events/event_dispatcher.py,sha256=fJBlZ5rCKkKZtfabWy9mueiFyV1kWotZBSQ9BpLTC8s,8354
|
|
@@ -122,7 +186,7 @@ wappa/messaging/whatsapp/models/media_models.py,sha256=4hGURi4gDnSY7lOCIWZiy_Td7
|
|
|
122
186
|
wappa/messaging/whatsapp/models/specialized_models.py,sha256=jus5IH5yKje2kph78UTnzj-PU44U20gc9qyHJO_t4xo,10215
|
|
123
187
|
wappa/messaging/whatsapp/models/template_models.py,sha256=rapAwbvJeJ4pqeDtSRyhoMZuVgiy-WFTmVVZCrcrpLA,8580
|
|
124
188
|
wappa/models/__init__.py,sha256=AwSeNSF-tZkO6ufQfhwa4SKN7PQ9mblWM9TybytkL2E,2505
|
|
125
|
-
wappa/persistence/__init__.py,sha256=
|
|
189
|
+
wappa/persistence/__init__.py,sha256=6TZvz6QR-k_Hu40NX7xH8sTv20UUQqe8tObooodjOxg,1956
|
|
126
190
|
wappa/persistence/cache_factory.py,sha256=428eCUWbo37fsSOPGCuMvjwqTn3FedCIeHBYf6oYKuA,2832
|
|
127
191
|
wappa/persistence/json/__init__.py,sha256=YWGnYXGXzljpM6Vhgb9qC0En_ffg3g63jxflIIddxMI,371
|
|
128
192
|
wappa/persistence/json/cache_adapters.py,sha256=mOOaERqeTsPmh4E-6W-Q36XmAEufUfT6b2SypbZt2FE,10253
|
|
@@ -225,8 +289,8 @@ wappa/webhooks/whatsapp/message_types/system.py,sha256=lrAwSTNokxjDkgCg7Hg33eb8s
|
|
|
225
289
|
wappa/webhooks/whatsapp/message_types/text.py,sha256=u3gXGMNpJFDdaJWA0vhBGFTyAEzI2fyqvtaVvZwzAhA,14688
|
|
226
290
|
wappa/webhooks/whatsapp/message_types/unsupported.py,sha256=5GxVcNNu2X5H1gZvze3iNNrZUrUs2DxmiL3bruS38RI,9532
|
|
227
291
|
wappa/webhooks/whatsapp/message_types/video.py,sha256=NR081ZyNwxajmCbOw-LvPadU97Qksghxr_TWhWsZEz0,11271
|
|
228
|
-
wappa-0.1.
|
|
229
|
-
wappa-0.1.
|
|
230
|
-
wappa-0.1.
|
|
231
|
-
wappa-0.1.
|
|
232
|
-
wappa-0.1.
|
|
292
|
+
wappa-0.1.9.dist-info/METADATA,sha256=8TJgY7G29O7zwxRJ7K9RLxLVfUKq0E-cLhpzzU8zuYA,15758
|
|
293
|
+
wappa-0.1.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
294
|
+
wappa-0.1.9.dist-info/entry_points.txt,sha256=KzfFZSK3VpWP4M-gpgh9AdKbhh4kOwiOI3q32e3NLHs,45
|
|
295
|
+
wappa-0.1.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
296
|
+
wappa-0.1.9.dist-info/RECORD,,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.12
|
|
File without changes
|
|
File without changes
|
|
File without changes
|