wappa 0.1.8__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-0.1.8.dist-info → wappa-0.1.9.dist-info}/METADATA +1 -1
- {wappa-0.1.8.dist-info → wappa-0.1.9.dist-info}/RECORD +75 -11
- 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.8.dist-info → wappa-0.1.9.dist-info}/WHEEL +0 -0
- {wappa-0.1.8.dist-info → wappa-0.1.9.dist-info}/entry_points.txt +0 -0
- {wappa-0.1.8.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!")
|
|
@@ -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
|
|
@@ -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
|