feat: AR-House initial commit

This commit is contained in:
2026-07-03 12:24:58 -04:00
commit 047c05287a
216 changed files with 127552 additions and 0 deletions
+143
View File
@@ -0,0 +1,143 @@
"""One-shot script to strip emojis + apply UI text changes to app.py.
Run once, then delete. Idempotent if re-run (no-ops on missing patterns).
"""
import re, sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
APP = ROOT / "app.py"
src = APP.read_text(encoding="utf-8")
orig = src
# ──── Phase A: Specific multi-token replacements (surgical) ─────────────────
SURGICAL = [
# st.set_page_config: page_icon
('page_icon="🏠",', 'page_icon=None,'),
# PAGES dict
('"manual": "🔬 Análisis manual"', '"manual": "Análisis"'),
('"search": "🔍 Buscar deals"', '"search": "Búsqueda"'),
('"inventory": "📦 Inventario"', '"inventory": "Inventario"'),
('"favorites": "⭐ Favoritos"', '"favorites": "Favoritos"'),
('"history": "📚 Histórico análisis"', '"history": "Histórico"'),
('"feed": "📡 Feed de deals"', '"feed": "Feed"'),
('"markets": "🌎 Mercados"', '"markets": "Mercados"'),
# Sidebar
('st.sidebar.title("🏠 AR-House")', 'st.sidebar.title("AR-House")'),
('st.sidebar.caption("Análisis FL real estate · 100% local")',
'st.sidebar.caption("Florida real estate analysis platform")'),
('st.sidebar.metric("⭐ Favoritos"', 'st.sidebar.metric("Favoritos"'),
# Page titles
('st.title("🔬 Análisis manual de deal")',
'st.title("Análisis manual de propiedad")'),
('st.title("📦 Inventario de deals scrapeados")',
'st.title("Inventario de oportunidades")'),
('st.title("⭐ Favoritos")', 'st.title("Favoritos")'),
('st.title("📚 Histórico de análisis")',
'st.title("Histórico de análisis")'),
('st.title("🔍 Buscar deals on-demand")',
'st.title("Búsqueda de propiedades")'),
('st.title("📡 Feed de deals")', 'st.title("Feed de oportunidades")'),
('st.title("🌎 Mercados monitoreados")',
'st.title("Cobertura de mercados")'),
# Subheaders
('st.subheader("🤖 Veredicto final (formato no parseado)")',
'st.subheader("Veredicto final (formato no parseado)")'),
('st.subheader("💰 Análisis financiero (DealAnalyzer)")',
'st.subheader("Análisis financiero")'),
('st.subheader("✉️ Generar email (EmailComposer)")',
'st.subheader("Generar comunicación al vendedor")'),
('st.subheader("1. 🌎 Condados")', 'st.subheader("1. Condados")'),
('st.subheader("2. 🛰️ Fuentes")', 'st.subheader("2. Fuentes")'),
('st.subheader("3. 🎛️ Filtros opcionales")',
'st.subheader("3. Filtros opcionales")'),
('st.subheader("4. 🚦 Preflight + accion")',
'st.subheader("4. Verificación previa y ejecución")'),
('st.subheader("📍 Cobertura por condado")',
'st.subheader("Cobertura por condado")'),
('st.subheader("🎯 Presets disponibles (markets_database.json)")',
'st.subheader("Presets disponibles")'),
('st.subheader("🚧 Gaps de cobertura conocidos")',
'st.subheader("Limitaciones conocidas")'),
# Buttons
('"◀ Anterior"', '"Anterior"'),
('"Siguiente ▶"', '"Siguiente"'),
('"✖ Limpiar banner"', '"Limpiar banner"'),
('" Nuevo análisis"', '"Nuevo análisis"'),
('"💾 Guardar análisis"', '"Guardar análisis"'),
('"📄 Exportar PDF"', '"Exportar PDF"'),
('"✨ Generar email"', '"Generar email"'),
('"📂 Cargar este análisis"', '"Cargar análisis"'),
('"📋 Cargar deal de prueba (Hialeah)"', '"Cargar deal de prueba (Hialeah)"'),
# VERDICT_BADGE
('"PASA": ("🟢", "#16a34a", "PASA"),',
'"PASA": ("", "#047857", "PASA"),'),
('"PASA CON CONDICIONES": ("🟡", "#ca8a04", "PASA CON CONDICIONES"),',
'"PASA CON CONDICIONES": ("", "#B45309", "PASA CON CONDICIONES"),'),
('"NO PASA": ("🔴", "#dc2626", "NO PASA"),',
'"NO PASA": ("", "#B91C1C", "NO PASA"),'),
# PROPERTY_TYPE_LABELS
('"sfr": "🏠 SFR (Single Family Residence)"',
'"sfr": "SFR — Single Family Residence"'),
('"condo": "🏢 Condo"', '"condo": "Condo"'),
('"townhome": "🏘️ Townhome"', '"townhome": "Townhome"'),
('"multi_family": "🏬 Multi-family (2-4 units)"',
'"multi_family": "Multi-family (24 units)"'),
('"land": "🌳 TERRENO / Lote vacante"',
'"land": "Terreno / Vacant lot"'),
('"mobile_home": "🚐 Mobile / Manufactured home"',
'"mobile_home": "Mobile / Manufactured home"'),
('"commercial": "🏛️ Commercial / Mixed-use"',
'"commercial": "Commercial / Mixed-use"'),
# Expanders
('with st.expander("📋 1. Inputs del deal", expanded=True):',
'with st.expander("1. Datos de la propiedad", expanded=True):'),
('with st.expander("🏘️ 1.4 Tipo de propiedad", expanded=True):',
'with st.expander("1.4 Tipo de propiedad", expanded=True):'),
('with st.expander("🔬 Análisis técnico completo (para revisión detallada)", expanded=False):',
'with st.expander("Análisis técnico completo (para revisión detallada)", expanded=False):'),
# Markdown headers in technical section
('st.markdown("### 💰 Análisis financiero (DealAnalyzer)")',
'st.markdown("### Análisis financiero (DealAnalyzer)")'),
('st.markdown("### 💵 ValueEstimator (valor real vs listing)")',
'st.markdown("### ValueEstimator (valor real vs listing)")'),
('st.markdown("### 🎯 OfferStrategist (Strike/Stretch/Walk-Away + estrategia)")',
'st.markdown("### OfferStrategist (Strike/Stretch/Walk-Away + estrategia)")'),
('st.markdown("### 🤖 Veredicto coordinador (Coordinator, markdown crudo)")',
'st.markdown("### Veredicto coordinador (Coordinator, markdown crudo)")'),
('st.markdown("### 💰 Liens Inventory contra la propiedad")',
'st.markdown("### Liens inventory contra la propiedad")'),
# Status messages — replace specific emoji-bearing patterns
('st.toast("Marcado como visto")', 'st.toast("Marcado como visto")'), # noop check
]
for old, new in SURGICAL:
if old in src:
src = src.replace(old, new)
# ──── Phase B: Strip emoji-prefix patterns inside f-strings/strings ─────────
# These are emoji + space at start of a quoted string content.
EMOJI_PREFIXES = [
'🚨🚨 ', '🚨 ', '⚠️ ', '', '', '🤖 ', '🚀 ', '💰 ', '🎯 ',
'🟢 ', '🟡 ', '🔴 ', '', '🔬 ', '💵 ', '🏛️ ', '🛡️ ', '🏢 ',
'🌳 ', '🏘️ ', '🍽 ', '🌍 ', '💼 ', '💎 ', '✉️ ', '👁️ ', '💔 ',
'', '📂 ', '📊 ', '📋 ', '👆 ', '💾 ', '📄 ', '🚧 ', '',
'🧠 ', '📭 ', '🌎 ', '🛰️ ', '🎛️ ', '🚦 ', '📍 ', '📡 ', '📦 ',
'🔍 ', '🔗 ', '', '🔎 ', '🇺🇸 ', '🇨🇴 ', '💡 ',
'🚨🚨', '🚨', '⚠️', '', '', '🤖', '🚀', '💰', '🎯',
'🟢', '🟡', '🔴', '', '🔬', '💵', '🏛️', '🛡️', '🏢',
'🌳', '🏘️', '🍽', '🌍', '💼', '💎', '✉️', '👁️', '💔',
'', '📂', '📊', '📋', '👆', '💾', '📄', '🚧', '',
'🧠', '📭', '🌎', '🛰️', '🎛️', '🚦', '📍', '📡', '📦',
'🔍', '🔗', '', '🔎', '🇺🇸', '🇨🇴', '💡',
]
for em in EMOJI_PREFIXES:
src = src.replace(em, '')
# ──── Phase C: Write back if changed ────────────────────────────────────────
if src != orig:
APP.write_text(src, encoding="utf-8")
print(f"app.py updated ({len(orig) - len(src)} chars removed)")
else:
print("No changes")