takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 from __future__ import print_function, division, absolute_import
kadonotakashi 0:8fdf9a60065b 2 import argparse
kadonotakashi 0:8fdf9a60065b 3 from os.path import basename
kadonotakashi 0:8fdf9a60065b 4 from tools.arm_pack_manager import Cache
kadonotakashi 0:8fdf9a60065b 5 from os.path import basename, join, dirname, exists
kadonotakashi 0:8fdf9a60065b 6 from os import makedirs
kadonotakashi 0:8fdf9a60065b 7 from itertools import takewhile
kadonotakashi 0:8fdf9a60065b 8 from fuzzywuzzy import process
kadonotakashi 0:8fdf9a60065b 9 from .arm_pack_manager import Cache
kadonotakashi 0:8fdf9a60065b 10
kadonotakashi 0:8fdf9a60065b 11 parser = argparse.ArgumentParser(description='A Handy little utility for keeping your cache of pack files up to date.')
kadonotakashi 0:8fdf9a60065b 12 subparsers = parser.add_subparsers(title="Commands")
kadonotakashi 0:8fdf9a60065b 13
kadonotakashi 0:8fdf9a60065b 14 def subcommand(name, *args, **kwargs):
kadonotakashi 0:8fdf9a60065b 15 def subcommand(command):
kadonotakashi 0:8fdf9a60065b 16 subparser = subparsers.add_parser(name, **kwargs)
kadonotakashi 0:8fdf9a60065b 17
kadonotakashi 0:8fdf9a60065b 18 for arg in args:
kadonotakashi 0:8fdf9a60065b 19 arg = dict(arg)
kadonotakashi 0:8fdf9a60065b 20 opt = arg['name']
kadonotakashi 0:8fdf9a60065b 21 del arg['name']
kadonotakashi 0:8fdf9a60065b 22
kadonotakashi 0:8fdf9a60065b 23 if isinstance(opt, basestring):
kadonotakashi 0:8fdf9a60065b 24 subparser.add_argument(opt, **arg)
kadonotakashi 0:8fdf9a60065b 25 else:
kadonotakashi 0:8fdf9a60065b 26 subparser.add_argument(*opt, **arg)
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 subparser.add_argument("-v", "--verbose", action="store_true", dest="verbose", help="Verbose diagnostic output")
kadonotakashi 0:8fdf9a60065b 29 subparser.add_argument("-vv", "--very_verbose", action="store_true", dest="very_verbose", help="Very verbose diagnostic output")
kadonotakashi 0:8fdf9a60065b 30 subparser.add_argument("--no-timeouts", action="store_true", help="Remove all timeouts and try to download unconditionally")
kadonotakashi 0:8fdf9a60065b 31 subparser.add_argument("--and", action="store_true", dest="intersection", help="combine search terms as if with an and")
kadonotakashi 0:8fdf9a60065b 32 subparser.add_argument("--or", action="store_false", dest="intersection", help="combine search terms as if with an or")
kadonotakashi 0:8fdf9a60065b 33 subparser.add_argument("--union", action="store_false", dest="intersection", help="combine search terms as if with a set union")
kadonotakashi 0:8fdf9a60065b 34 subparser.add_argument("--intersection", action="store_true", dest="intersection", help="combine search terms as if with a set intersection")
kadonotakashi 0:8fdf9a60065b 35
kadonotakashi 0:8fdf9a60065b 36 def thunk(parsed_args):
kadonotakashi 0:8fdf9a60065b 37 cache = Cache(not parsed_args.verbose, parsed_args.no_timeouts)
kadonotakashi 0:8fdf9a60065b 38 argv = [arg['dest'] if 'dest' in arg else arg['name'] for arg in args]
kadonotakashi 0:8fdf9a60065b 39 argv = [(arg if isinstance(arg, basestring) else arg[-1]).strip('-')
kadonotakashi 0:8fdf9a60065b 40 for arg in argv]
kadonotakashi 0:8fdf9a60065b 41 argv = {arg: vars(parsed_args)[arg] for arg in argv
kadonotakashi 0:8fdf9a60065b 42 if vars(parsed_args)[arg] is not None}
kadonotakashi 0:8fdf9a60065b 43
kadonotakashi 0:8fdf9a60065b 44 return command(cache, **argv)
kadonotakashi 0:8fdf9a60065b 45
kadonotakashi 0:8fdf9a60065b 46 subparser.set_defaults(command=thunk)
kadonotakashi 0:8fdf9a60065b 47 return command
kadonotakashi 0:8fdf9a60065b 48 return subcommand
kadonotakashi 0:8fdf9a60065b 49
kadonotakashi 0:8fdf9a60065b 50 def user_selection (message, options) :
kadonotakashi 0:8fdf9a60065b 51 print(message)
kadonotakashi 0:8fdf9a60065b 52 for choice, index in zip(options, range(len(options))) :
kadonotakashi 0:8fdf9a60065b 53 print("({}) {}".format(index, choice))
kadonotakashi 0:8fdf9a60065b 54 pick = None
kadonotakashi 0:8fdf9a60065b 55 while pick is None :
kadonotakashi 0:8fdf9a60065b 56 stdout.write("please select an integer from 0 to {} or \"all\"".format(len(options)-1))
kadonotakashi 0:8fdf9a60065b 57 input = raw_input()
kadonotakashi 0:8fdf9a60065b 58 try :
kadonotakashi 0:8fdf9a60065b 59 if input == "all" :
kadonotakashi 0:8fdf9a60065b 60 pick = options
kadonotakashi 0:8fdf9a60065b 61 else :
kadonotakashi 0:8fdf9a60065b 62 pick = [options[int(input)]]
kadonotakashi 0:8fdf9a60065b 63 except ValueError :
kadonotakashi 0:8fdf9a60065b 64 print("I did not understand your input")
kadonotakashi 0:8fdf9a60065b 65 return pick
kadonotakashi 0:8fdf9a60065b 66
kadonotakashi 0:8fdf9a60065b 67 def fuzzy_find(matches, urls) :
kadonotakashi 0:8fdf9a60065b 68 choices = {}
kadonotakashi 0:8fdf9a60065b 69 for match in matches :
kadonotakashi 0:8fdf9a60065b 70 for key, value in process.extract(match, urls, limit=None) :
kadonotakashi 0:8fdf9a60065b 71 choices.setdefault(key, 0)
kadonotakashi 0:8fdf9a60065b 72 choices[key] += value
kadonotakashi 0:8fdf9a60065b 73 choices = sorted([(v, k) for k, v in choices.items()], reverse=True)
kadonotakashi 0:8fdf9a60065b 74 if not choices : return []
kadonotakashi 0:8fdf9a60065b 75 elif len(choices) == 1 : return [choices[0][1]]
kadonotakashi 0:8fdf9a60065b 76 elif choices[0][0] > choices[1][0] : choices = choices[:1]
kadonotakashi 0:8fdf9a60065b 77 else : choices = list(takewhile(lambda t: t[0] == choices[0][0], choices))
kadonotakashi 0:8fdf9a60065b 78 return [v for k,v in choices]
kadonotakashi 0:8fdf9a60065b 79
kadonotakashi 0:8fdf9a60065b 80 @subcommand('cache',
kadonotakashi 0:8fdf9a60065b 81 dict(name='matches', nargs="*",
kadonotakashi 0:8fdf9a60065b 82 help="a bunch of things to search for in part names"),
kadonotakashi 0:8fdf9a60065b 83 dict(name=['-e','--everything'], action="store_true",
kadonotakashi 0:8fdf9a60065b 84 help="download everything possible"),
kadonotakashi 0:8fdf9a60065b 85 dict(name=['-d','--descriptors'], action="store_true",
kadonotakashi 0:8fdf9a60065b 86 help="download all descriptors"),
kadonotakashi 0:8fdf9a60065b 87 dict(name=["-b","--batch"], action="store_true",
kadonotakashi 0:8fdf9a60065b 88 help="don't ask for user input and assume download all"),
kadonotakashi 0:8fdf9a60065b 89 help="Cache a group of PACK or PDSC files")
kadonotakashi 0:8fdf9a60065b 90 def command_cache (cache, matches, everything=False, descriptors=False, batch=False, verbose= False, intersection=True) :
kadonotakashi 0:8fdf9a60065b 91 if everything :
kadonotakashi 0:8fdf9a60065b 92 cache.cache_everything()
kadonotakashi 0:8fdf9a60065b 93 return True
kadonotakashi 0:8fdf9a60065b 94 if descriptors :
kadonotakashi 0:8fdf9a60065b 95 cache.cache_descriptors()
kadonotakashi 0:8fdf9a60065b 96 return True
kadonotakashi 0:8fdf9a60065b 97 if not matches :
kadonotakashi 0:8fdf9a60065b 98 print("No action specified nothing to do")
kadonotakashi 0:8fdf9a60065b 99 else :
kadonotakashi 0:8fdf9a60065b 100 urls = cache.get_urls()
kadonotakashi 0:8fdf9a60065b 101 if intersection :
kadonotakashi 0:8fdf9a60065b 102 choices = fuzzy_find(matches, map(basename, urls))
kadonotakashi 0:8fdf9a60065b 103 else :
kadonotakashi 0:8fdf9a60065b 104 choices = sum([fuzzy_find([m], map(basename, urls)) for m in matches], [])
kadonotakashi 0:8fdf9a60065b 105 if not batch and len(choices) > 1 :
kadonotakashi 0:8fdf9a60065b 106 choices = user_selection("Please select a file to cache", choices)
kadonotakashi 0:8fdf9a60065b 107 to_download = []
kadonotakashi 0:8fdf9a60065b 108 for choice in choices :
kadonotakashi 0:8fdf9a60065b 109 for url in urls :
kadonotakashi 0:8fdf9a60065b 110 if choice in url :
kadonotakashi 0:8fdf9a60065b 111 to_download.append(url)
kadonotakashi 0:8fdf9a60065b 112 cache.cache_pack_list(to_download)
kadonotakashi 0:8fdf9a60065b 113 return True
kadonotakashi 0:8fdf9a60065b 114
kadonotakashi 0:8fdf9a60065b 115
kadonotakashi 0:8fdf9a60065b 116 @subcommand('find-part',
kadonotakashi 0:8fdf9a60065b 117 dict(name='matches', nargs="+", help="words to match to processors"),
kadonotakashi 0:8fdf9a60065b 118 dict(name=['-l',"--long"], action="store_true",
kadonotakashi 0:8fdf9a60065b 119 help="print out part details with part"),
kadonotakashi 0:8fdf9a60065b 120 dict(name=['-p', '--parts-only'], action="store_false", dest="print_aliases"),
kadonotakashi 0:8fdf9a60065b 121 dict(name=['-a', '--aliases-only'], action="store_false", dest="print_parts"),
kadonotakashi 0:8fdf9a60065b 122 help="Find a Part and it's description within the cache")
kadonotakashi 0:8fdf9a60065b 123 def command_find_part (cache, matches, long=False, intersection=True,
kadonotakashi 0:8fdf9a60065b 124 print_aliases=True, print_parts=True) :
kadonotakashi 0:8fdf9a60065b 125 if long :
kadonotakashi 0:8fdf9a60065b 126 import pprint
kadonotakashi 0:8fdf9a60065b 127 pp = pprint.PrettyPrinter()
kadonotakashi 0:8fdf9a60065b 128 parts = cache.index
kadonotakashi 0:8fdf9a60065b 129 if intersection :
kadonotakashi 0:8fdf9a60065b 130 choices = fuzzy_find(matches, parts.keys())
kadonotakashi 0:8fdf9a60065b 131 aliases = fuzzy_find(matches, cache.aliases.keys())
kadonotakashi 0:8fdf9a60065b 132 else :
kadonotakashi 0:8fdf9a60065b 133 choices = sum([fuzzy_find([m], parts.keys()) for m in matches], [])
kadonotakashi 0:8fdf9a60065b 134 aliases = sum([fuzzy_find([m], cache.aliases.keys()) for m in matches], [])
kadonotakashi 0:8fdf9a60065b 135 if print_parts:
kadonotakashi 0:8fdf9a60065b 136 for part in choices :
kadonotakashi 0:8fdf9a60065b 137 print(part)
kadonotakashi 0:8fdf9a60065b 138 if long :
kadonotakashi 0:8fdf9a60065b 139 pp.pprint(cache.index[part])
kadonotakashi 0:8fdf9a60065b 140 if print_aliases:
kadonotakashi 0:8fdf9a60065b 141 for alias in aliases :
kadonotakashi 0:8fdf9a60065b 142 print(alias)
kadonotakashi 0:8fdf9a60065b 143 if long :
kadonotakashi 0:8fdf9a60065b 144 pp.pprint(cache.index[cache.aliases[alias]])
kadonotakashi 0:8fdf9a60065b 145
kadonotakashi 0:8fdf9a60065b 146 @subcommand('dump-parts',
kadonotakashi 0:8fdf9a60065b 147 dict(name='out', help='directory to dump to'),
kadonotakashi 0:8fdf9a60065b 148 dict(name='parts', nargs='+', help='parts to dump'),
kadonotakashi 0:8fdf9a60065b 149 help='Create a directory with an index.json describing the part and all of their associated flashing algorithms.'
kadonotakashi 0:8fdf9a60065b 150 )
kadonotakashi 0:8fdf9a60065b 151 def command_dump_parts (cache, out, parts, intersection=False) :
kadonotakashi 0:8fdf9a60065b 152 index = {}
kadonotakashi 0:8fdf9a60065b 153 if intersection :
kadonotakashi 0:8fdf9a60065b 154 for part in fuzzy_find(parts, cache.index):
kadonotakashi 0:8fdf9a60065b 155 index.update(cache.index[part])
kadonotakashi 0:8fdf9a60065b 156 else :
kadonotakashi 0:8fdf9a60065b 157 for part in parts :
kadonotakashi 0:8fdf9a60065b 158 index.update(dict(cache.find_device(part)))
kadonotakashi 0:8fdf9a60065b 159 for n, p in index.items() :
kadonotakashi 0:8fdf9a60065b 160 try :
kadonotakashi 0:8fdf9a60065b 161 if not exists(join(out, dirname(p['algorithm']['file']))) :
kadonotakashi 0:8fdf9a60065b 162 makedirs(join(out, dirname(p['algorithm']['file'])))
kadonotakashi 0:8fdf9a60065b 163 with open(join(out, p['algorithm']['file']), "wb+") as fd :
kadonotakashi 0:8fdf9a60065b 164 fd.write(cache.get_flash_algorthim_binary(n).read())
kadonotakashi 0:8fdf9a60065b 165 except KeyError:
kadonotakashi 0:8fdf9a60065b 166 print("[Warning] {} does not have an associated flashing algorithm".format(n))
kadonotakashi 0:8fdf9a60065b 167 with open(join(out, "index.json"), "wb+") as fd :
kadonotakashi 0:8fdf9a60065b 168 dump(index,fd)
kadonotakashi 0:8fdf9a60065b 169
kadonotakashi 0:8fdf9a60065b 170
kadonotakashi 0:8fdf9a60065b 171 @subcommand('cache-part',
kadonotakashi 0:8fdf9a60065b 172 dict(name='matches', nargs="+", help="words to match to devices"),
kadonotakashi 0:8fdf9a60065b 173 help='Cache PACK files associated with the parts matching the provided words')
kadonotakashi 0:8fdf9a60065b 174 def command_cache_part (cache, matches, intersection=True) :
kadonotakashi 0:8fdf9a60065b 175 index = cache.index
kadonotakashi 0:8fdf9a60065b 176 if intersection :
kadonotakashi 0:8fdf9a60065b 177 choices = fuzzy_find(matches, index.keys())
kadonotakashi 0:8fdf9a60065b 178 aliases = fuzzy_find(matches, cache.aliases.keys())
kadonotakashi 0:8fdf9a60065b 179 else :
kadonotakashi 0:8fdf9a60065b 180 choices = sum([fuzzy_find([m], index.keys()) for m in matches], [])
kadonotakashi 0:8fdf9a60065b 181 aliases = sum([fuzzy_find([m], cache.aliases.keys()) for m in matches], [])
kadonotakashi 0:8fdf9a60065b 182 urls = set([index[c]['pdsc_file'] for c in choices])
kadonotakashi 0:8fdf9a60065b 183 urls += set([index[cache.aliasse[a]] for a in aliases])
kadonotakashi 0:8fdf9a60065b 184 cache.cache_pack_list(list(urls))
kadonotakashi 0:8fdf9a60065b 185
kadonotakashi 0:8fdf9a60065b 186 def get_argparse() :
kadonotakashi 0:8fdf9a60065b 187 return parser
kadonotakashi 0:8fdf9a60065b 188
kadonotakashi 0:8fdf9a60065b 189 def main() :
kadonotakashi 0:8fdf9a60065b 190 args = parser.parse_args()
kadonotakashi 0:8fdf9a60065b 191 args.command(args)
kadonotakashi 0:8fdf9a60065b 192