Skip to content

Commit cd07dae

Browse files
committed
jmespath
1 parent ef473f6 commit cd07dae

9 files changed

Lines changed: 372 additions & 998 deletions

File tree

json_explorer/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from .logging_config import configure_logging, get_logger
44
from .analyzer import analyze_json
5-
from .search import JsonSearcher, SearchMode, SearchResult
5+
from .search import JsonSearcher, SearchResult
66
from .stats import DataStatsAnalyzer, generate_stats
77
from .visualizer import JSONVisualizer, visualize_json
88
from .utils import load_json, JSONLoaderError
@@ -16,9 +16,8 @@
1616
# Core
1717
"analyze_json",
1818
"load_json",
19-
# Search
19+
# Search (now JMESPath-based)
2020
"JsonSearcher",
21-
"SearchMode",
2221
"SearchResult",
2322
# Statistics
2423
"DataStatsAnalyzer",

json_explorer/cli.py

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
from rich.console import Console
44

55
from .tree_view import print_json_analysis, print_compact_tree
6-
from .search import JsonSearcher, SearchMode
6+
from .search import JsonSearcher
77
from .stats import DataStatsAnalyzer
88
from .visualizer import JSONVisualizer
9-
from .filter_parser import FilterExpressionParser
109
from .logging_config import get_logger
1110

1211
logger = get_logger(__name__)
@@ -69,8 +68,6 @@ def run(self, args: Any) -> int:
6968
if getattr(args, "plot", False):
7069
self._handle_visualization(args)
7170

72-
# Note: Code generation is handled by main.py -> handle_codegen_command()
73-
# This keeps the CLI focused on core analysis features
7471
return 0
7572

7673
def _handle_tree_display(self, tree_type: str) -> None:
@@ -93,53 +90,29 @@ def _handle_tree_display(self, tree_type: str) -> None:
9390
self.console.print(f"❌ [red]Unknown tree type: {tree_type}[/red]")
9491

9592
def _handle_search(self, args: Any) -> None:
96-
"""Handle search operations.
93+
"""Handle JMESPath search operations.
9794
9895
Args:
9996
args: Parsed CLI arguments containing search parameters.
10097
"""
101-
search_mode = SearchMode(args.search_mode)
102-
search_term = args.search
103-
104-
logger.info(
105-
"Performing search: type=%s, term=%s", args.search_type, search_term
106-
)
107-
108-
# Determine search type
109-
results = []
110-
if args.search_type == "key":
111-
results = self.searcher.search_keys(self.data, search_term, search_mode)
112-
elif args.search_type == "value":
113-
results = self.searcher.search_values(self.data, search_term, search_mode)
114-
elif args.search_type == "pair":
115-
if not getattr(args, "search_value", None):
116-
self.console.print(
117-
"❌ [red]--search-value required for pair search[/red]"
118-
)
119-
logger.warning("Pair search attempted without search_value")
120-
return
121-
results = self.searcher.search_key_value_pairs(
122-
self.data, search_term, args.search_value, search_mode, search_mode
123-
)
124-
elif args.search_type == "filter":
125-
try:
126-
filter_func = FilterExpressionParser.parse_filter(search_term)
127-
results = self.searcher.search_with_filter(self.data, filter_func)
128-
except Exception as e:
129-
self.console.print(f"❌ [red]Filter error: {e}[/red]")
130-
logger.error("Filter search failed: %s", e)
131-
return
132-
else:
133-
self.console.print(f"❌ [red]Unknown search type: {args.search_type}[/red]")
134-
logger.warning("Unknown search type: %s", args.search_type)
98+
query = args.search
99+
logger.info("Performing JMESPath search: %s", query)
100+
101+
# Validate query first
102+
valid, error = self.searcher.validate_query(query)
103+
if not valid:
104+
self.console.print(f"❌ [red]Invalid JMESPath query: {error}[/red]")
105+
logger.error("Invalid JMESPath query: %s", error)
135106
return
136107

108+
# Execute search
109+
result = self.searcher.search(self.data, query)
110+
137111
# Display results
138-
if results:
112+
if result:
139113
show_tree = getattr(args, "tree_results", False)
140-
self.searcher.print_results(results, show_tree=show_tree, mode=search_mode)
141-
self.console.print(f"\n📊 Found {len(results)} result(s)")
142-
logger.info("Search completed: %d results found", len(results))
114+
self.searcher.print_result(result, show_tree=show_tree)
115+
logger.info("Search completed successfully")
143116
else:
144117
self.console.print("[yellow]No results found.[/yellow]")
145118
logger.info("Search completed: no results found")
@@ -161,7 +134,7 @@ def _handle_visualization(self, args: Any) -> None:
161134
Args:
162135
args: Parsed CLI arguments containing visualization options.
163136
"""
164-
plot_format = getattr(args, "plot_format", "matplotlib")
137+
plot_format = getattr(args, "plot_format", "interactive")
165138
save_path = getattr(args, "save_path", None)
166139
detailed = getattr(args, "detailed", False)
167140
open_browser = not getattr(args, "no_browser", False)

json_explorer/filter_parser.py

Lines changed: 0 additions & 227 deletions
This file was deleted.

0 commit comments

Comments
 (0)