GodsDevProject commited on
Commit
bd6ac57
Β·
verified Β·
1 Parent(s): 7174502

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -26
app.py CHANGED
@@ -7,6 +7,8 @@ from ingest.health import get_adapter_health
7
  from ingest.coverage import coverage_summary
8
  from ingest.discovery import agency_discovery
9
  from ingest.semantic import semantic_refine, semantic_available
 
 
10
  from analytics.events import log_event
11
 
12
  ALL_ADAPTERS = get_all_adapters()
@@ -19,12 +21,12 @@ def run_search(
19
  enable_semantic: bool,
20
  ) -> List[Dict]:
21
 
22
- log_event("search", {"query_length": len(query or "")})
23
 
24
  if not query:
25
  return []
26
 
27
- results: List[Dict] = []
28
 
29
  for adapter in ALL_ADAPTERS:
30
  if not include_stubs and not adapter.is_live:
@@ -35,12 +37,12 @@ def run_search(
35
  continue
36
 
37
  try:
38
- adapter_results = adapter.search(query)
39
- for r in adapter_results:
40
- r.setdefault("agency", adapter.name)
41
- r.setdefault("exportable", adapter.is_live)
42
- r.setdefault("status", "🟒 Live" if adapter.is_live else "πŸ”’ Stub")
43
- results.append(r)
44
  except Exception as e:
45
  results.append({
46
  "agency": adapter.name,
@@ -57,38 +59,35 @@ def run_search(
57
  return results
58
 
59
 
60
- def table_from_results(results: List[Dict]):
61
  return [
62
  [
63
- r.get("agency", ""),
64
- r.get("status", ""),
65
- r.get("title", ""),
66
- r.get("snippet", ""),
67
- r.get("url", ""),
68
  ]
69
  for r in results
70
  ]
71
 
72
 
73
- def export_handler(results: List[Dict]):
74
  exportable = [r for r in results if r.get("exportable")]
75
  if not exportable:
76
  return gr.File.update(visible=False)
77
- return gr.File.update(
78
- value=export_results(exportable),
79
- visible=True
80
- )
81
 
82
 
83
  with gr.Blocks() as app:
84
  gr.Markdown(
85
  "# πŸ›οΈ Federal FOIA Intelligence Search\n"
86
- "### Public Electronic Reading Rooms Only"
87
  )
88
 
89
  gr.Markdown(
90
- "ℹ️ **Stub results are informational and cannot be exported.**\n\n"
91
- "Semantic search is optional and operates only on returned results."
92
  )
93
 
94
  query = gr.Textbox(label="Search query")
@@ -113,18 +112,32 @@ with gr.Blocks() as app:
113
 
114
  results_table = gr.Dataframe(
115
  headers=["Agency", "Status", "Title", "Snippet", "URL"],
116
- interactive=False,
117
- wrap=True
118
  )
119
 
120
  export_btn = gr.Button("Export Results (ZIP)", interactive=False)
121
  export_file = gr.File(visible=False)
122
 
 
123
  coverage_table = gr.Dataframe(
124
  headers=["Agency", "Result Count"],
125
  interactive=False
126
  )
127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  discovery_table = gr.Dataframe(
129
  headers=["Agency", "Status", "Reason"],
130
  interactive=False
@@ -144,10 +157,16 @@ with gr.Blocks() as app:
144
  fn=lambda r: (
145
  table_from_results(r),
146
  coverage_summary(r),
 
147
  gr.Button.update(interactive=any(x.get("exportable") for x in r))
148
  ),
149
  inputs=results_state,
150
- outputs=[results_table, coverage_table, export_btn]
 
 
 
 
 
151
  )
152
 
153
  export_btn.click(
@@ -156,7 +175,7 @@ with gr.Blocks() as app:
156
  outputs=export_file
157
  )
158
 
159
- gr.Markdown("## 🌐 Agency Coverage")
160
  discovery_table.value = agency_discovery()
161
 
162
  gr.Markdown("## πŸ” Adapter Health")
 
7
  from ingest.coverage import coverage_summary
8
  from ingest.discovery import agency_discovery
9
  from ingest.semantic import semantic_refine, semantic_available
10
+ from ingest.timeline import release_timeline
11
+ from ingest.latency import latency_badges
12
  from analytics.events import log_event
13
 
14
  ALL_ADAPTERS = get_all_adapters()
 
21
  enable_semantic: bool,
22
  ) -> List[Dict]:
23
 
24
+ log_event("search", {"len": len(query or "")})
25
 
26
  if not query:
27
  return []
28
 
29
+ results = []
30
 
31
  for adapter in ALL_ADAPTERS:
32
  if not include_stubs and not adapter.is_live:
 
37
  continue
38
 
39
  try:
40
+ docs = adapter.search(query)
41
+ for d in docs:
42
+ d.setdefault("agency", adapter.name)
43
+ d.setdefault("status", "🟒 Live" if adapter.is_live else "πŸ”’ Stub")
44
+ d.setdefault("exportable", adapter.is_live)
45
+ results.append(d)
46
  except Exception as e:
47
  results.append({
48
  "agency": adapter.name,
 
59
  return results
60
 
61
 
62
+ def table_from_results(results):
63
  return [
64
  [
65
+ r.get("agency"),
66
+ r.get("status"),
67
+ r.get("title"),
68
+ r.get("snippet"),
69
+ r.get("url"),
70
  ]
71
  for r in results
72
  ]
73
 
74
 
75
+ def export_handler(results):
76
  exportable = [r for r in results if r.get("exportable")]
77
  if not exportable:
78
  return gr.File.update(visible=False)
79
+ return gr.File.update(value=export_results(exportable), visible=True)
 
 
 
80
 
81
 
82
  with gr.Blocks() as app:
83
  gr.Markdown(
84
  "# πŸ›οΈ Federal FOIA Intelligence Search\n"
85
+ "Public Electronic Reading Rooms only"
86
  )
87
 
88
  gr.Markdown(
89
+ "ℹ️ Stub results are informational and cannot be exported.\n\n"
90
+ "Semantic refinement is optional and runs only on returned results."
91
  )
92
 
93
  query = gr.Textbox(label="Search query")
 
112
 
113
  results_table = gr.Dataframe(
114
  headers=["Agency", "Status", "Title", "Snippet", "URL"],
115
+ wrap=True,
116
+ interactive=False
117
  )
118
 
119
  export_btn = gr.Button("Export Results (ZIP)", interactive=False)
120
  export_file = gr.File(visible=False)
121
 
122
+ gr.Markdown("## πŸ“Š Coverage Heatmap")
123
  coverage_table = gr.Dataframe(
124
  headers=["Agency", "Result Count"],
125
  interactive=False
126
  )
127
 
128
+ gr.Markdown("## πŸ•’ Release Timeline")
129
+ timeline_table = gr.Dataframe(
130
+ headers=["Period", "Documents"],
131
+ interactive=False
132
+ )
133
+
134
+ gr.Markdown("## ⚑ Agency Latency Badges")
135
+ latency_table = gr.Dataframe(
136
+ headers=["Agency", "Latency (s)", "Badge"],
137
+ interactive=False
138
+ )
139
+
140
+ gr.Markdown("## 🌐 Agency Discovery")
141
  discovery_table = gr.Dataframe(
142
  headers=["Agency", "Status", "Reason"],
143
  interactive=False
 
157
  fn=lambda r: (
158
  table_from_results(r),
159
  coverage_summary(r),
160
+ release_timeline(r),
161
  gr.Button.update(interactive=any(x.get("exportable") for x in r))
162
  ),
163
  inputs=results_state,
164
+ outputs=[
165
+ results_table,
166
+ coverage_table,
167
+ timeline_table,
168
+ export_btn
169
+ ]
170
  )
171
 
172
  export_btn.click(
 
175
  outputs=export_file
176
  )
177
 
178
+ latency_table.value = latency_badges(ALL_ADAPTERS)
179
  discovery_table.value = agency_discovery()
180
 
181
  gr.Markdown("## πŸ” Adapter Health")