diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..a8f43fe
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,2 @@
+[tool.black]
+line-length = 79
diff --git a/scripts/parse_led.py b/scripts/parse_led.py
index f03d3c0..1464ba7 100755
--- a/scripts/parse_led.py
+++ b/scripts/parse_led.py
@@ -4,29 +4,32 @@
 import argparse
 from inflection import underscore
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     script_dir = os.path.dirname(os.path.realpath(__file__))
     parser = argparse.ArgumentParser()
     parser.add_argument(
-        "-f", "--filename",
-        default='led.yaml',
-        help="Input File Name")
+        "-f", "--filename", default="led.yaml", help="Input File Name"
+    )
     parser.add_argument(
-        "-i", "--input-dir",
-        dest='inputdir',
+        "-i",
+        "--input-dir",
+        dest="inputdir",
         default=script_dir,
-        help="Input directory")
+        help="Input directory",
+    )
     parser.add_argument(
-        '-o', '--output-dir',
-        dest='outputdir',
-        default='.',
-        help='Output directory.')
+        "-o",
+        "--output-dir",
+        dest="outputdir",
+        default=".",
+        help="Output directory.",
+    )
 
     args = parser.parse_args()
 
     # Default to the one that is in the current.
     yaml_dir = script_dir
-    yaml_file = os.path.join(yaml_dir, 'led.yaml')
+    yaml_file = os.path.join(yaml_dir, "led.yaml")
 
     if args.inputdir:
         yaml_dir = args.inputdir
@@ -34,55 +37,61 @@
     if args.filename:
         yaml_file = os.path.join(yaml_dir, args.filename)
 
-    with open(yaml_file, 'r') as f:
+    with open(yaml_file, "r") as f:
         ifile = yaml.safe_load(f)
 
     # Dictionary having [Name:Priority]
     priority_dict = {}
 
-    with open(os.path.join(args.outputdir, 'led-gen.hpp'), 'w') as ofile:
-        ofile.write('/* !!! WARNING: This is a GENERATED Code..')
-        ofile.write('Please do NOT Edit !!! */\n\n')
+    with open(os.path.join(args.outputdir, "led-gen.hpp"), "w") as ofile:
+        ofile.write("/* !!! WARNING: This is a GENERATED Code..")
+        ofile.write("Please do NOT Edit !!! */\n\n")
 
-        ofile.write('static const std::unordered_map<std::string,')
-        ofile.write(' std::set<phosphor::led::Layout::LedAction>>')
-        ofile.write(' systemLedMap = {\n\n')
+        ofile.write("static const std::unordered_map<std::string,")
+        ofile.write(" std::set<phosphor::led::Layout::LedAction>>")
+        ofile.write(" systemLedMap = {\n\n")
         for group in list(ifile.keys()):
             # This section generates an std::unordered_map of LedGroupNames to
             # std::set of LEDs containing the name and properties
             led_dict = ifile[group]
             ofile.write(
-                '   {\"' +
-                "/xyz/openbmc_project/led/groups/" +
-                underscore(group) +
-                '\",{\n')
+                '   {"'
+                + "/xyz/openbmc_project/led/groups/"
+                + underscore(group)
+                + '",{\n'
+            )
 
             # Some LED groups could be empty
             if not led_dict:
-                ofile.write('   }},\n')
+                ofile.write("   }},\n")
                 continue
 
             for led_name, list_dict in list(led_dict.items()):
-                value = list_dict.get('Priority')
+                value = list_dict.get("Priority")
                 if led_name in priority_dict:
                     if value != priority_dict[led_name]:
                         # Priority for a particular LED needs to stay SAME
                         # across all groups
                         ofile.close()
                         os.remove(ofile.name)
-                        raise ValueError("Priority for [" +
-                                         led_name +
-                                         "] is NOT same across all groups")
+                        raise ValueError(
+                            "Priority for ["
+                            + led_name
+                            + "] is NOT same across all groups"
+                        )
                 else:
                     priority_dict[led_name] = value
 
-                ofile.write('        {\"' + underscore(led_name) + '\",')
-                ofile.write('phosphor::led::Layout::Action::' +
-                            str(list_dict.get('Action', 'Off')) + ',')
-                ofile.write(str(list_dict.get('DutyOn', 50)) + ',')
-                ofile.write(str(list_dict.get('Period', 0)) + ',')
-                priority = str(list_dict.get('Priority', 'Blink'))
-                ofile.write('phosphor::led::Layout::Action::' + priority + ',')
-                ofile.write('},\n')
-            ofile.write('   }},\n')
-        ofile.write('};\n')
+                ofile.write('        {"' + underscore(led_name) + '",')
+                ofile.write(
+                    "phosphor::led::Layout::Action::"
+                    + str(list_dict.get("Action", "Off"))
+                    + ","
+                )
+                ofile.write(str(list_dict.get("DutyOn", 50)) + ",")
+                ofile.write(str(list_dict.get("Period", 0)) + ",")
+                priority = str(list_dict.get("Priority", "Blink"))
+                ofile.write("phosphor::led::Layout::Action::" + priority + ",")
+                ofile.write("},\n")
+            ofile.write("   }},\n")
+        ofile.write("};\n")
