User:Bugman/subsystems: Difference between revisions
From FlightGear wiki
Jump to navigation
Jump to search
m (Sectioning.) |
|||
Line 1: | Line 1: | ||
== | == Tracking down subsystems == | ||
=== Script === | |||
The following script is for finding all FlightGear dependencies: | The following script is for finding all FlightGear dependencies: | ||
Line 124: | Line 126: | ||
FindSubsystems() | FindSubsystems() | ||
}} | }} | ||
=== All subsystems === | |||
The result is: | The result is: |
Revision as of 10:04, 18 April 2018
Tracking down subsystems
Script
The following script is for finding all FlightGear dependencies:
Python script: Python script for finding all subsystems within the C++ code base.
#! /usr/bin/env python3
import operator
from re import search, split
from subprocess import PIPE, Popen
class FindSubsystems:
def __init__(self):
# Init.
self.classes_primary = []
self.classes_secondary = []
self.classes_tertiary = []
self.classes_quaternary = []
self.find_primary_classes()
self.find_secondary_classes()
self.find_tertiary_classes()
self.find_quaternary_classes()
self.classes_primary.sort(key=operator.attrgetter('name'))
self.classes_secondary.sort(key=operator.attrgetter('name'))
self.classes_tertiary.sort(key=operator.attrgetter('name'))
self.classes_quaternary.sort(key=operator.attrgetter('name'))
# Print out.
print("\nPrimary classes (%i):" % len(self.classes_primary))
for subsystem in self.classes_primary:
print(" %s" % subsystem)
if self.classes_secondary:
print("\nSecondary classes (%i):" % len(self.classes_secondary))
for subsystem in self.classes_secondary:
print(" %s" % subsystem)
if self.classes_tertiary:
print("\nTertiary classes (%i):" % len(self.classes_tertiary))
for subsystem in self.classes_tertiary:
print(" %s" % subsystem)
if self.classes_quaternary:
print("\nQuaternary classes (%i):" % len(self.classes_quaternary))
for subsystem in self.classes_quaternary:
print(" %s" % subsystem)
print("\nTotal: %i subsystem classes." % len(self.classes_primary + self.classes_secondary + self.classes_tertiary + self.classes_quaternary))
def find_primary_classes(self):
base = Subsystem("SGSubsystem")
for file_name, class_name in self.grep("SGSubsystem"):
self.classes_primary.append(Subsystem(class_name, base_class=base, file_name=file_name))
def find_secondary_classes(self):
for subsystem in self.classes_primary:
for file_name, derived_class in self.grep(subsystem.name):
self.classes_secondary.append(Subsystem(derived_class, base_class=subsystem, file_name=file_name))
def find_tertiary_classes(self):
for subsystem in self.classes_secondary:
for file_name, derived_class in self.grep(subsystem.name):
self.classes_tertiary.append(Subsystem(derived_class, base_class=subsystem, file_name=file_name))
def find_quaternary_classes(self):
for subsystem in self.classes_tertiary:
for file_name, derived_class in self.grep(subsystem.name):
self.classes_quaternary.append(Subsystem(derived_class, base_class=subsystem, file_name=file_name))
def grep(self, base_name):
cmd = 'grep -rI "public \<%s\>" | grep -v "%s::"' % (base_name, base_name)
pipe = Popen(cmd, shell=True, stdout=PIPE)
for line in pipe.stdout.readlines():
line = line.decode()
if search("grep ", line):
continue
if not search("class ", line):
print("Skipping: %s" % repr(line[:-1]))
continue
elements = split("(?<!:):(?!:)", line)
file_name = elements[0]
class_name = elements[1]
class_name = class_name.replace("class", "")
class_name = class_name.strip()
yield file_name, class_name
class Subsystem:
def __init__(self, name, base_class=None, file_name=None):
self.name = name
self.base_class = base_class
self.file_name = file_name
def __repr__(self):
string = "<%s" % self.name
if self.base_class:
string += " (from %s" % self.base_class.name
if self.base_class.base_class:
string += " : %s" % self.base_class.base_class.name
if self.base_class.base_class.base_class:
string += " : %s" % self.base_class.base_class.base_class.name
if self.base_class.base_class.base_class.base_class:
string += " : %s" % self.base_class.base_class.base_class.base_class.name
string += ")"
string += ">"
return string
if __name__ == "__main__":
FindSubsystems()
All subsystems
The result is:
Text output: Output from the Python script for finding all subsystems within the C++ code base.
Skipping: 'src/FDM/SP/AISim.hpp: : public FGInterface'
Primary classes (83):
<ADF (from SGSubsystem)>
<AirportDynamicsManager (from SGSubsystem)>
<AirspeedIndicator (from SGSubsystem)>
<Altimeter (from SGSubsystem)>
<AreaSampler (from SGSubsystem)>
<AttitudeIndicator (from SGSubsystem)>
<Clock (from SGSubsystem)>
<CommRadio (from SGSubsystem)>
<Component (from SGSubsystem)>
<DCLGPS (from SGSubsystem)>
<DME (from SGSubsystem)>
<Ephemeris (from SGSubsystem)>
<FDMShell (from SGSubsystem)>
<FGAIManager (from SGSubsystem)>
<FGATCManager (from SGSubsystem)>
<FGAircraftModel (from SGSubsystem)>
<FGCom (from SGSubsystem)>
<FGControls (from SGSubsystem)>
<FGDNSClient (from SGSubsystem)>
<FGElectricalSystem (from SGSubsystem)>
<FGEventInput (from SGSubsystem)>
<FGFX (from SGSubsystem)>
<FGFlightHistory (from SGSubsystem)>
<FGHTTPClient (from SGSubsystem)>
<FGHttpd (from SGSubsystem)>
<FGIO (from SGSubsystem)>
<FGInterface (from SGSubsystem)>
<FGJoystickInput (from SGSubsystem)>
<FGKR_87 (from SGSubsystem)>
<FGKeyboardInput (from SGSubsystem)>
<FGLight (from SGSubsystem)>
<FGLogger (from SGSubsystem)>
<FGMagVarManager (from SGSubsystem)>
<FGMarkerBeacon (from SGSubsystem)>
<FGModelMgr (from SGSubsystem)>
<FGMouseInput (from SGSubsystem)>
<FGMultiplayMgr (from SGSubsystem)>
<FGNasalSys (from SGSubsystem)>
<FGNavRadio (from SGSubsystem)>
<FGPanel (from SGSubsystem)>
<FGPanelProtocol (from SGSubsystem)>
<FGPrecipitationMgr (from SGSubsystem)>
<FGProperties (from SGSubsystem)>
<FGReplay (from SGSubsystem)>
<FGRidgeLift (from SGSubsystem)>
<FGRouteMgr (from SGSubsystem)>
<FGScenery (from SGSubsystem)>
<FGSoundManager (from SGSubsystem)>
<FGSubmodelMgr (from SGSubsystem)>
<FGTrafficManager (from SGSubsystem)>
<FGViewMgr (from SGSubsystem)>
<FGVoiceMgr (from SGSubsystem)>
<GPS (from SGSubsystem)>
<GSDI (from SGSubsystem)>
<GUIMgr (from SGSubsystem)>
<GroundRadar (from SGSubsystem)>
<HUD (from SGSubsystem)>
<HeadingIndicator (from SGSubsystem)>
<HeadingIndicatorDG (from SGSubsystem)>
<HeadingIndicatorFG (from SGSubsystem)>
<InstVerticalSpeedIndicator (from SGSubsystem)>
<LayerInterpolateController (from SGSubsystem)>
<MK_VIII (from SGSubsystem)>
<MagCompass (from SGSubsystem)>
<MasterReferenceGyro (from SGSubsystem)>
<NavDisplay (from SGSubsystem)>
<NavRadio (from SGSubsystem)>
<NewGUI (from SGSubsystem)>
<PerformanceDB (from SGSubsystem)>
<PitotSystem (from SGSubsystem)>
<RadarAltimeter (from SGSubsystem)>
<RealWxController (from SGSubsystem)>
<SlipSkidBall (from SGSubsystem)>
<StaticSystem (from SGSubsystem)>
<TACAN (from SGSubsystem)>
<TCAS (from SGSubsystem)>
<TimeManager (from SGSubsystem)>
<Transponder (from SGSubsystem)>
<TurnIndicator (from SGSubsystem)>
<VacuumSystem (from SGSubsystem)>
<VerticalSpeedIndicator (from SGSubsystem)>
<View (from SGSubsystem)>
<wxRadarBg (from SGSubsystem)>
Secondary classes (25):
<AnalogComponent (from Component : SGSubsystem)>
<BasicRealWxController (from RealWxController : SGSubsystem)>
<CommRadioImpl (from CommRadio : SGSubsystem)>
<DigitalComponent (from Component : SGSubsystem)>
<FGACMS (from FGInterface : SGSubsystem)>
<FGADA (from FGInterface : SGSubsystem)>
<FGBalloonSim (from FGInterface : SGSubsystem)>
<FGExternalNet (from FGInterface : SGSubsystem)>
<FGExternalPipe (from FGInterface : SGSubsystem)>
<FGHIDEventInput (from FGEventInput : SGSubsystem)>
<FGJSBsim (from FGInterface : SGSubsystem)>
<FGLaRCsim (from FGInterface : SGSubsystem)>
<FGLinuxEventInput (from FGEventInput : SGSubsystem)>
<FGMacOSXEventInput (from FGEventInput : SGSubsystem)>
<FGMagicCarpet (from FGInterface : SGSubsystem)>
<FGNullFDM (from FGInterface : SGSubsystem)>
<FGReadablePanel (from FGPanel : SGSubsystem)>
<FGUFO (from FGInterface : SGSubsystem)>
<KLN89 (from DCLGPS : SGSubsystem)>
<LayerInterpolateControllerImplementation (from LayerInterpolateController : SGSubsystem)>
<MongooseHttpd (from FGHttpd : SGSubsystem)>
<NavRadioImpl (from NavRadio : SGSubsystem)>
<StateMachineComponent (from Component : SGSubsystem)>
<YASim (from FGInterface : SGSubsystem)>
<agRadar (from wxRadarBg : SGSubsystem)>
Tertiary classes (6):
<DigitalFilter (from AnalogComponent : Component : SGSubsystem)>
<Logic (from DigitalComponent : Component : SGSubsystem)>
<NoaaMetarRealWxController (from BasicRealWxController : RealWxController : SGSubsystem)>
<PIDController (from AnalogComponent : Component : SGSubsystem)>
<PISimpleController (from AnalogComponent : Component : SGSubsystem)>
<Predictor (from AnalogComponent : Component : SGSubsystem)>
Quaternary classes (1):
<FlipFlop (from Logic : DigitalComponent : Component : SGSubsystem)>
Total: 115 subsystem classes.
Refactoring
To check that all subsystems on a branch have been updated or refactored:
Python script: Python script verifying if all subsystems have been updated.
#! /usr/bin/env python3
from find_subsystems import FindSubsystems
from subprocess import PIPE, Popen
class ToUpdate:
def __init__(self):
subsystems = FindSubsystems()
pipe = Popen("git diff --name-only ..next", shell=True, stdout=PIPE)
blacklist = []
for line in pipe.stdout.readlines():
file_name = line.decode()
file_name = file_name.strip()
blacklist.append(file_name)
# Loop over all derived classes.
print("\nStill to be updated:")
for subsystem in subsystems.classes_primary + subsystems.classes_secondary + subsystems.classes_tertiary + subsystems.classes_quaternary:
if subsystem.file_name in blacklist:
continue
print(" %s: %s" % (subsystem.file_name, subsystem))
if __name__ == "__main__":
ToUpdate()