Sure, here's the code:
import configparser
from TM1py import TM1Service
config = configparser.ConfigParser()
config.read("../space.cfg")
tm1_connection = {
"base_url": config.get("TM1", "base_url"),
"port": config.getint("TM1", "port", fallback=443),
"user": config.get("TM1", "user"),
"password": config.get("TM1", "password"),
"namespace": config.get("TM1", "namespace", fallback="")
}
try:
with TM1Service(**tm1_connection) as tm1:
print(f"Connected to TM1 Server: {tm1.server.get_server_name()}")
cubes = tm1.cubes.get_all()
data = []
for cube in cubes:
try:
rule_text = cube.rules or ""
if cube.name.startswith('}') or not rule_text:
continue
cleaned_lines = []
for line in rule_text.body.splitlines():
line = line.strip()
if line and not line.startswith('#'):
cleaned_lines.append(line)
joined_rules = ' '.join(cleaned_lines)
# Count feeder blocks
feeder_count = joined_rules.upper().count('FEEDERS')
# Remove feeders block (conservatively from FEEDERS to next semicolon)
joined_rules_no_feeders = re.sub(r'FEEDERS.*?;', '', joined_rules, flags=re.IGNORECASE)
# Count rules as number of semicolons
rule_count = joined_rules_no_feeders.count(';')
data.append({
"Cube": cube.name,
"Rules": rule_count,
"Feeders": feeder_count
})
except Exception as e:
print(f"Error reading rules for cube {cube.name}: {e}")
# Output the results as a DataFrame
df = pd.DataFrame(data)
print(df.to_string(index=False))
except Exception as e:
print(f"Error connecting to TM1: {e}")