Skip to content

Commit 4a097e8

Browse files
committed
add list_questions() documentation
1 parent 594241a commit 4a097e8

File tree

4 files changed

+600
-1
lines changed

4 files changed

+600
-1
lines changed

examples/README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,24 @@ This directory contains comprehensive examples demonstrating how to use the Jupi
129129
- `create_question()` - Create questions with J1QL queries
130130
- `list_questions()` - List all questions in the account
131131

132+
### 9. **examples.py**
133+
**Purpose**: Comprehensive examples of all major SDK methods
134+
- Client setup and basic operations
135+
- Entity and relationship management
136+
- Integration and sync job operations
137+
- Alert rules and SmartClass operations
138+
- Questions management and analysis
139+
- Account parameter operations
140+
141+
**Key Methods Demonstrated**:
142+
- All major SDK methods including:
143+
- `list_questions()` - List and analyze all questions in the account
144+
- `create_question()` - Create questions with various configurations
145+
- Entity lifecycle management methods
146+
- Relationship management methods
147+
- Integration and sync job methods
148+
- Alert rule and SmartClass methods
149+
132150
## 🚀 Getting Started
133151

134152
### Prerequisites
@@ -184,6 +202,13 @@ python 08_questions_management.py
184202
- Time-based queries
185203
- Complex multi-step queries
186204

205+
### 📊 Questions Management
206+
- Question creation with J1QL queries
207+
- Question listing and analysis
208+
- Compliance metadata management
209+
- Question categorization and filtering
210+
- Question lifecycle management
211+
187212
### 🏗️ Entity Management
188213
- Entity creation with various property types
189214
- Entity updates and modifications
@@ -254,6 +279,25 @@ j1 = JupiterOneClient(
254279
)
255280
```
256281

282+
### Questions Analysis
283+
Examples show how to analyze questions data:
284+
```python
285+
# List all questions
286+
questions = j1.list_questions()
287+
288+
# Analyze by compliance standards
289+
compliance_standards = {}
290+
for question in questions:
291+
if 'compliance' in question and question['compliance']:
292+
compliance = question['compliance']
293+
if isinstance(compliance, dict) and 'standard' in compliance:
294+
standard = compliance['standard']
295+
compliance_standards[standard] = compliance_standards.get(standard, 0) + 1
296+
297+
# Find questions by tags
298+
security_questions = [q for q in questions if 'tags' in q and q['tags'] and any('security' in tag.lower() for tag in q['tags'])]
299+
```
300+
257301
## 📝 Notes
258302

259303
### Placeholder Values

examples/examples.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,3 +568,81 @@
568568

569569
r = j1.create_update_parameter(name="ParameterName", value="stored_value", secret=False)
570570
print(json.dumps(r, indent=1))
571+
572+
# list_questions
573+
list_questions_r = j1.list_questions()
574+
print("list_questions()")
575+
print(f"Total questions found: {len(list_questions_r)}")
576+
print(json.dumps(list_questions_r[:2], indent=1)) # Show first 2 questions
577+
578+
# list_questions with filtering (if supported)
579+
# Note: The current implementation doesn't support filtering parameters,
580+
# but the GraphQL schema shows support for searchQuery, tags, etc.
581+
print("\nlist_questions() - Sample question details:")
582+
if list_questions_r:
583+
sample_question = list_questions_r[0]
584+
print(f" Title: {sample_question.get('title', 'No title')}")
585+
print(f" ID: {sample_question.get('id', 'No ID')}")
586+
print(f" Description: {sample_question.get('description', 'No description')}")
587+
print(f" Tags: {sample_question.get('tags', [])}")
588+
print(f" Number of queries: {len(sample_question.get('queries', []))}")
589+
if sample_question.get('queries'):
590+
for i, query in enumerate(sample_question['queries']):
591+
print(f" Query {i+1}: {query.get('name', 'Unnamed')} - {query.get('query', 'No query')[:50]}...")
592+
else:
593+
print(" No questions found in the account")
594+
595+
# list_questions - analyze question types and compliance
596+
print("\nlist_questions() - Analysis:")
597+
if list_questions_r:
598+
# Count questions by compliance standard
599+
compliance_standards = {}
600+
question_types = {}
601+
602+
for question in list_questions_r:
603+
# Analyze compliance standards
604+
if 'compliance' in question and question['compliance']:
605+
compliance = question['compliance']
606+
if isinstance(compliance, dict) and 'standard' in compliance:
607+
standard = compliance['standard']
608+
compliance_standards[standard] = compliance_standards.get(standard, 0) + 1
609+
610+
# Analyze question types by tags
611+
if 'tags' in question and question['tags']:
612+
for tag in question['tags']:
613+
question_types[tag] = question_types.get(tag, 0) + 1
614+
615+
print(f" Total questions: {len(list_questions_r)}")
616+
print(f" Compliance standards found: {len(compliance_standards)}")
617+
if compliance_standards:
618+
print(" Standards:")
619+
for standard, count in compliance_standards.items():
620+
print(f" {standard}: {count} questions")
621+
622+
print(f" Question categories (by tags): {len(question_types)}")
623+
if question_types:
624+
print(" Top categories:")
625+
sorted_tags = sorted(question_types.items(), key=lambda x: x[1], reverse=True)[:5]
626+
for tag, count in sorted_tags:
627+
print(f" {tag}: {count} questions")
628+
629+
# list_questions - find specific types of questions
630+
print("\nlist_questions() - Finding specific questions:")
631+
if list_questions_r:
632+
# Find security-related questions
633+
security_questions = [q for q in list_questions_r if 'tags' in q and q['tags'] and any('security' in tag.lower() for tag in q['tags'])]
634+
print(f" Security-related questions: {len(security_questions)}")
635+
636+
# Find compliance-related questions
637+
compliance_questions = [q for q in list_questions_r if 'compliance' in q and q['compliance']]
638+
print(f" Compliance-related questions: {len(compliance_questions)}")
639+
640+
# Find questions with variables
641+
variable_questions = [q for q in list_questions_r if 'variables' in q and q['variables']]
642+
print(f" Questions with variables: {len(variable_questions)}")
643+
644+
# Find questions with polling enabled
645+
polling_questions = [q for q in list_questions_r if 'pollingInterval' in q and q['pollingInterval'] and q['pollingInterval'] != 'DISABLED']
646+
print(f" Questions with polling enabled: {len(polling_questions)}")
647+
648+
print()

jupiterone/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1247,7 +1247,7 @@ def fetch_downloaded_evaluation_results(self, download_url: str = None):
12471247
return e
12481248

12491249
def list_questions(self):
1250-
"""List all defined Questions configured in J1 account Questions Library"""
1250+
"""List all defined Questions configured in J1 Account Questions Library"""
12511251
results = []
12521252

12531253
data = {

0 commit comments

Comments
 (0)