Astronomy and astrophysics core library providing comprehensive tools for astronomical computations and data handling
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Package configuration system and structured logging for astronomical applications with persistent settings and runtime control.
Configuration system for managing package settings with validation, persistence, and hierarchical organization.
class ConfigNamespace:
"""
Base class for configuration namespaces containing ConfigItem members.
Provides hierarchical organization of configuration parameters
with automatic file persistence and runtime modification.
"""
def __init__(self): ...
def reload(self, attr=None):
"""Reload configuration from file."""
def reset(self, attr=None):
"""Reset configuration to defaults."""
def set_temp(self, attr, value):
"""Temporarily set configuration value."""
class ConfigItem:
"""
Individual configuration parameter with validation and persistence.
Parameters:
- defaultvalue: default parameter value
- description: parameter description
- cfgtype: configuration type specification
- module: module this item belongs to
- aliases: alternative names for this parameter
"""
def __init__(self, defaultvalue='', description='', cfgtype=None,
module=None, aliases=None): ...
def set(self, value):
"""Set configuration value with validation."""
def reload(self):
"""Reload value from configuration file."""
def reset(self):
"""Reset to default value."""
@property
def description(self):
"""Parameter description."""
@property
def cfgtype(self):
"""Configuration type."""
@property
def module(self):
"""Associated module."""
@property
def aliases(self):
"""Parameter aliases."""Functions for managing configuration files, directories, and global settings.
def get_config(packageormod=None, reload=False, rootname='astropy'):
"""
Get configuration object for package or module.
Parameters:
- packageormod: package/module or name
- reload: reload from file
- rootname: root configuration name
Returns:
ConfigNamespace: configuration object
"""
def reload_config(packageormod=None, rootname='astropy'):
"""
Reload configuration from file.
Parameters:
- packageormod: package/module to reload
- rootname: root configuration name
"""
def generate_config(pkgname='astropy', filename=None, verbose=False):
"""
Generate configuration file from ConfigItems.
Parameters:
- pkgname: package name
- filename: output filename (default: auto-generated)
- verbose: print verbose output
Returns:
str: generated configuration content
"""
def create_config_file(pkg, rootname='astropy', overwrite=False):
"""
Create configuration file for package.
Parameters:
- pkg: package object
- rootname: root configuration name
- overwrite: overwrite existing file
"""
def get_config_dir(rootname='astropy'):
"""
Get configuration directory path.
Parameters:
- rootname: root name for configuration
Returns:
str: configuration directory path
"""
def get_cache_dir(rootname='astropy'):
"""
Get cache directory path.
Parameters:
- rootname: root name for cache
Returns:
str: cache directory path
"""
def set_temp_config(path=None, delete=False):
"""
Context manager for temporary configuration directory.
Parameters:
- path: temporary directory path
- delete: delete directory on exit
Returns:
context manager
"""
def set_temp_cache(path=None, delete=False):
"""
Context manager for temporary cache directory.
Parameters:
- path: temporary directory path
- delete: delete directory on exit
Returns:
context manager
"""Structured logging system for astronomical applications with configurable output and filtering.
# Access main logger
from astropy import log
# Logger configuration
log.setLevel('INFO') # Set logging level
log.addHandler(handler) # Add custom handler
log.removeHandler(handler) # Remove handler
# Logging methods
log.debug("Debug message")
log.info("Info message")
log.warning("Warning message")
log.error("Error message")
log.critical("Critical message")
# Exception logging
try:
# Some operation
pass
except Exception as e:
log.exception("Operation failed")
# Logging with context
with log.log_to_file('output.log'):
log.info("This goes to file")
# Disable/enable logging
log.disable_warnings_logging()
log.enable_warnings_logging()Built-in configuration parameters for common astropy settings.
# Main astropy configuration
from astropy import conf
# Display and output settings
conf.unicode_output: ConfigItem # Use Unicode characters in output
conf.use_color: ConfigItem # Use ANSI color codes
conf.max_lines: ConfigItem # Maximum display lines
conf.max_width: ConfigItem # Maximum display width
# Download and caching
conf.download_cache_timeout: ConfigItem # Download timeout
conf.delete_temporary_downloads_at_exit: ConfigItem # Cleanup temp files
conf.compute_hash_block_size: ConfigItem # Hash computation block size
# Example usage
conf.unicode_output = True
conf.max_lines = 50from astropy import config
from astropy.config import ConfigItem, ConfigNamespace
# Create custom configuration namespace
class MyConfig(ConfigNamespace):
# Define configuration items
data_dir = ConfigItem(
'/tmp/data',
'Directory for data files',
cfgtype='string'
)
max_files = ConfigItem(
100,
'Maximum number of files to process',
cfgtype='integer'
)
verbose = ConfigItem(
False,
'Enable verbose output',
cfgtype='boolean'
)
# Use configuration
my_conf = MyConfig()
print(f"Data directory: {my_conf.data_dir}")
print(f"Max files: {my_conf.max_files}")
# Modify configuration
my_conf.verbose = True
my_conf.max_files = 200from astropy.config import generate_config, get_config_dir
import os
# Get configuration directory
config_dir = get_config_dir()
print(f"Configuration directory: {config_dir}")
# Generate configuration file content
config_content = generate_config('astropy', verbose=True)
print("Generated configuration:")
print(config_content[:500] + "...")
# Write custom configuration
config_file = os.path.join(config_dir, 'astropy.cfg')
with open(config_file, 'w') as f:
f.write("""
[astropy]
unicode_output = True
use_color = True
max_lines = 100
[coordinates]
auto_download_sites = True
""")
# Reload configuration
from astropy import conf
conf.reload()from astropy import conf
from astropy.config import set_temp_config
import tempfile
# Temporary configuration values
print(f"Original max_lines: {conf.max_lines}")
with conf.set_temp('max_lines', 25):
print(f"Temporary max_lines: {conf.max_lines}")
# Configuration change is active here
print(f"Restored max_lines: {conf.max_lines}")
# Temporary configuration directory
with set_temp_config() as temp_dir:
print(f"Using temporary config dir: {temp_dir}")
# Custom configuration active in this blockfrom astropy import log
import logging
# Set logging level
log.setLevel('DEBUG')
# Log messages at different levels
log.debug("Detailed debugging information")
log.info("General information")
log.warning("Something might be wrong")
log.error("An error occurred")
# Configure log format
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
# Log to file
with log.log_to_file('astropy.log', filter_level='INFO'):
log.info("This message goes to file")
log.debug("This debug message is filtered out")
# Capture warnings
import warnings
with log.enable_warnings_logging():
warnings.warn("This warning will be logged")from astropy.config import ConfigItem, ConfigNamespace
from astropy import units as u
# Configuration with units and validation
class ObservatoryConfig(ConfigNamespace):
latitude = ConfigItem(
0.0 * u.degree,
'Observatory latitude',
cfgtype='angle'
)
longitude = ConfigItem(
0.0 * u.degree,
'Observatory longitude',
cfgtype='angle'
)
elevation = ConfigItem(
0.0 * u.meter,
'Observatory elevation',
cfgtype='length'
)
def validate_coordinates(self):
\"\"\"Validate observatory coordinates.\"\"\"
if abs(self.latitude) > 90 * u.degree:
raise ValueError("Invalid latitude")
if abs(self.longitude) > 180 * u.degree:
raise ValueError("Invalid longitude")
# Use with validation
obs_conf = ObservatoryConfig()
obs_conf.latitude = 37.2431 * u.degree # Lick Observatory
obs_conf.longitude = -121.6369 * u.degree
obs_conf.elevation = 1283 * u.meter
obs_conf.validate_coordinates()# Access configuration for specific astropy subpackages
from astropy.table import conf as table_conf
from astropy.coordinates import conf as coord_conf
from astropy.units import conf as units_conf
# Table configuration
print(f"Table max lines: {table_conf.max_lines}")
print(f"Table max width: {table_conf.max_width}")
# Coordinates configuration
print(f"Auto download sites: {coord_conf.auto_download_sites}")
# Units configuration
print(f"Enabled equivalencies: {units_conf.enable_equivalencies}")
# Modify subpackage configuration
table_conf.max_lines = 25
coord_conf.auto_download_sites = False#!/usr/bin/env python
\"\"\"
Example script using astropy configuration system.
\"\"\"
from astropy.config import ConfigNamespace, ConfigItem
from astropy import log
import sys
class ScriptConfig(ConfigNamespace):
input_file = ConfigItem(
'data.fits',
'Input FITS file to process'
)
output_dir = ConfigItem(
'./output',
'Output directory for results'
)
debug = ConfigItem(
False,
'Enable debug output'
)
def main():
# Initialize configuration
conf = ScriptConfig()
# Set logging level based on configuration
if conf.debug:
log.setLevel('DEBUG')
else:
log.setLevel('INFO')
log.info(f"Processing file: {conf.input_file}")
log.info(f"Output directory: {conf.output_dir}")
# Process data using configuration values
# ...
if __name__ == '__main__':
main()