fbnet/command_runner/options.py (21 lines of code) (raw):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import argparse
from argparse import HelpFormatter
from operator import attrgetter
from fbnet.command_runner.exceptions import AttributeErrorException
class SortingHelpFormatter(HelpFormatter):
def add_arguments(self, actions):
actions = sorted(actions, key=attrgetter("option_strings"))
super(SortingHelpFormatter, self).add_arguments(actions)
class Option:
"""
A simple wrapper around argparse.
"""
config = None
parser = argparse.ArgumentParser(formatter_class=SortingHelpFormatter)
def __init__(self, *args, **kwargs):
self._action = Option.parser.add_argument(*args, **kwargs)
self._dest = self._action.dest
@classmethod
def parse_args(cls, args=None):
Option.config = Option.parser.parse_args(args)
def __get__(self, instance, owner):
return getattr(Option.config, self._dest)
def __set__(self, instance, value):
"""Options are immutable and can't be set"""
raise AttributeErrorException()