Search Patterns Analysis¶
This section provides a detailed analysis of how the schema search system works in JSONCrack for Sphinx Extension.
Object Structure¶
Let’s consider an example of a full object path:
perekrestok_api.endpoints.catalog.ProductService.similar
│ │ │ │ │
│ └─────────┼───────┘ │
│ │ │
Package Path Class.Method
Path components:
Package:
perekrestok_api
Path components:
endpoints.catalog
Class:
ProductService
Method:
similar
Full path:
perekrestok_api.endpoints.catalog.ProductService.similar
All Possible SearchPolicy Combinations¶
1. Default Policy¶
SearchPolicy(
include_package_name=False, # default
include_path_to_file=True, # default
path_to_file_separator=PathSeparator.DOT,
path_to_class_separator=PathSeparator.DOT
)
Search patterns (in priority order):
1. ProductService.similar.schema.json ← Highest priority
2. ProductService.similar.json
3. catalog.ProductService.similar.schema.json
4. catalog.ProductService.similar.json
5. endpoints.catalog.ProductService.similar.schema.json
6. endpoints.catalog.ProductService.similar.json
7. similar.schema.json
8. similar.json
9. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json ← Fallback
10. perekrestok_api.endpoints.catalog.ProductService.similar.json
2. Without Intermediate Paths¶
SearchPolicy(
include_package_name=False,
include_path_to_file=False, # ❌ Remove endpoints.catalog
path_to_file_separator=PathSeparator.DOT,
path_to_class_separator=PathSeparator.DOT
)
Search patterns:
1. ProductService.similar.schema.json ← Highest priority
2. ProductService.similar.json
3. similar.schema.json
4. similar.json
5. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json ← Fallback
6. perekrestok_api.endpoints.catalog.ProductService.similar.json
🚫 Skipped:
catalog.ProductService.similar.schema.json
endpoints.catalog.ProductService.similar.schema.json
3. With Package Name Included¶
SearchPolicy(
include_package_name=True, # ✅ Include perekrestok_api
include_path_to_file=True,
path_to_file_separator=PathSeparator.DOT,
path_to_class_separator=PathSeparator.DOT
)
Search patterns:
1. ProductService.similar.schema.json ← Highest priority
2. ProductService.similar.json
3. catalog.ProductService.similar.schema.json
4. catalog.ProductService.similar.json
5. endpoints.catalog.ProductService.similar.schema.json
6. endpoints.catalog.ProductService.similar.json
7. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json ← Included earlier
8. perekrestok_api.endpoints.catalog.ProductService.similar.json
9. similar.schema.json
10. similar.json
4. Slash Separators¶
SearchPolicy(
include_package_name=False,
include_path_to_file=True,
path_to_file_separator=PathSeparator.SLASH, # 🔄 Use /
path_to_class_separator=PathSeparator.DOT
)
Search patterns:
1. ProductService.similar.schema.json ← Highest priority
2. ProductService.similar.json
3. endpoints/catalog/ProductService.similar.schema.json ← Directories
4. endpoints/catalog/ProductService.similar.json
5. similar.schema.json
6. similar.json
7. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json ← Fallback
8. perekrestok_api.endpoints.catalog.ProductService.similar.json
5. Slashes + Package¶
SearchPolicy(
include_package_name=True, # ✅ Include perekrestok_api
include_path_to_file=True,
path_to_file_separator=PathSeparator.SLASH,
path_to_class_separator=PathSeparator.DOT
)
Search patterns:
1. ProductService.similar.schema.json ← Highest priority
2. ProductService.similar.json
3. endpoints/catalog/ProductService.similar.schema.json
4. endpoints/catalog/ProductService.similar.json
5. perekrestok_api/endpoints/catalog/ProductService.similar.schema.json ← Full structure
6. perekrestok_api/endpoints/catalog/ProductService.similar.json
7. similar.schema.json
8. similar.json
6. No Separators¶
SearchPolicy(
include_package_name=False,
include_path_to_file=True,
path_to_file_separator=PathSeparator.NONE, # 🔄 No separators
path_to_class_separator=PathSeparator.NONE
)
Search patterns:
1. ProductServicesimilar.schema.json ← Concatenated
2. ProductServicesimilar.json
3. catalogProductServicesimilar.schema.json
4. catalogProductServicesimilar.json
5. endpointscatalogProductServicesimilar.schema.json
6. endpointscatalogProductServicesimilar.json
7. similar.schema.json
8. similar.json
9. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json ← Fallback
10. perekrestok_api.endpoints.catalog.ProductService.similar.json
7. Extreme Configuration¶
SearchPolicy(
include_package_name=True,
include_path_to_file=False, # ❌ No intermediate paths
path_to_file_separator=PathSeparator.SLASH,
path_to_class_separator=PathSeparator.NONE
)
Search patterns:
1. ProductServicesimilar.schema.json ← Concatenated class+method
2. ProductServicesimilar.json
3. perekrestok_api/ProductServicesimilar.schema.json ← Package + concatenated
4. perekrestok_api/ProductServicesimilar.json
5. similar.schema.json
6. similar.json
7. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json ← Fallback
8. perekrestok_api.endpoints.catalog.ProductService.similar.json
8. With Custom Patterns¶
SearchPolicy(
include_package_name=False,
include_path_to_file=True,
path_to_file_separator=PathSeparator.DOT,
path_to_class_separator=PathSeparator.DOT,
custom_patterns=[
'api_{class_name}_{method_name}',
'{object_name}_spec',
'schemas/{class_name}/{method_name}'
]
)
Search patterns:
1. api_ProductService_similar.schema.json ← Custom 1
2. api_ProductService_similar.json
3. perekrestok_api.endpoints.catalog.ProductService.similar_spec.schema.json ← Custom 2
4. perekrestok_api.endpoints.catalog.ProductService.similar_spec.json
5. schemas/ProductService/similar.schema.json ← Custom 3
6. schemas/ProductService/similar.json
7. ProductService.similar.schema.json ← Standard patterns
8. ProductService.similar.json
9. catalog.ProductService.similar.schema.json
10. catalog.ProductService.similar.json
11. endpoints.catalog.ProductService.similar.schema.json
12. endpoints.catalog.ProductService.similar.json
13. similar.schema.json
14. similar.json
15. perekrestok_api.endpoints.catalog.ProductService.similar.schema.json
16. perekrestok_api.endpoints.catalog.ProductService.similar.json
Summary Table of Combinations¶
include_package |
include_path |
file_sep |
class_sep |
First Pattern |
Intermediate |
---|---|---|---|---|---|
False |
True |
DOT |
DOT |
|
|
False |
False |
DOT |
DOT |
|
🚫 Skipped |
True |
True |
DOT |
DOT |
|
Full package prioritized |
False |
True |
SLASH |
DOT |
|
|
True |
True |
SLASH |
DOT |
|
|
False |
True |
NONE |
NONE |
|
|
True |
False |
SLASH |
NONE |
|
|
Usage Recommendations¶
For Simple Schema Organization¶
SearchPolicy(include_path_to_file=False)
Searches for: ProductService.similar.schema.json
, similar.schema.json
For Hierarchical Organization¶
SearchPolicy(
include_path_to_file=True,
path_to_file_separator=PathSeparator.SLASH
)
Searches for: endpoints/catalog/ProductService.similar.schema.json
For API-Specific Schemas¶
SearchPolicy(
custom_patterns=['api_{class_name}_{method_name}']
)
Searches for: api_ProductService_similar.schema.json
For Maximum Flexibility¶
SearchPolicy(
include_package_name=True,
include_path_to_file=True,
path_to_file_separator=PathSeparator.SLASH,
custom_patterns=['api_{class_name}_{method_name}']
)
Searches for all possible combinations!
Practical Examples¶
Example 1: Simple Project Structure¶
If you have a simple project structure and want to keep schemas close to code:
# conf.py
jsoncrack_default_options = {
'search_policy': SearchPolicy(
include_package_name=False,
include_path_to_file=False
)
}
This will search for schemas in this order:
MyClass.method.schema.json
method.schema.json
Example 2: Centralized Schemas¶
If all schemas are stored in a separate schemas/
directory:
# conf.py
json_schema_dir = 'schemas'
jsoncrack_default_options = {
'search_policy': SearchPolicy(
include_package_name=True,
include_path_to_file=True,
path_to_file_separator=PathSeparator.SLASH
)
}
File structure:
schemas/
├── mypackage/
│ └── module/
│ └── MyClass.method.schema.json
└── MyClass.method.schema.json
Example 3: API Documentation¶
For REST API with custom schema names:
# conf.py
jsoncrack_default_options = {
'search_policy': SearchPolicy(
custom_patterns=[
'api_{class_name}_{method_name}.request.json',
'api_{class_name}_{method_name}.response.json',
'{class_name}_{method_name}_schema.json'
]
)
}
Will search for:
api_UserService_create.request.json
api_UserService_create.response.json
UserService_create_schema.json
Schema Search Debugging¶
To debug schema search functionality, enable detailed logging:
# conf.py
jsoncrack_debug_logging = True
This will output detailed information about:
Generated search patterns
Found and not found files
Reasons for selecting specific schemas
Errors during schema processing
Example debug output:
[JSONCrack] Searching for schema: mypackage.module.MyClass.method
[JSONCrack] Generated patterns:
1. MyClass.method.schema.json
2. MyClass.method.json
3. module.MyClass.method.schema.json
4. method.schema.json
[JSONCrack] Found: schemas/MyClass.method.schema.json
[JSONCrack] Selected schema: schemas/MyClass.method.schema.json