3 \me @sddlZddlmZddlmZmZddlmZeedddZ deeeee dd d Z eeed d d Z deeeeeee dddZdS)N) ModuleType)OptionalSequence)util) module_namereturncCs tj|S)N) importlib import_module)rr /usr/lib/python3.6/importer.pyr sr )rattrsrcCs:d}|s |Stj|}x|D]}t||r|d7}qW|S)Nr)rr hasattr)rr Z found_attrsmodattrr r r _count_attrss    r)mod_namercCsd|jkr|dd}|jds,d|}i}tjjd}|r|jrx|jD]}|jtj|qNWx$|jD]}|j|jkrp|SqpW|S)zECheck the importable datasource modules for a case-insensitive match.z nocloud-netNZ DataSourcezcloudinit.sources) lower startswithrr find_specsubmodule_search_locationsupdateZget_modules_from_dirvalues)rmodulesspecdirmoduler r r "match_case_insensitive_module_name#s       r) base_name search_pathsrequired_attrsrcCsn|sg}g}g}xT|D]L}djtd||g}|j|tjj|sFqt||t|kr|j|qW||fS)zFinds specified modules.N)joinfilterappendrrrrlen)r r!r"Z lookup_pathsZ found_pathspath full_pathr r r find_module7s   r*)N)N)rtypesrZtypingrrZ cloudinitrstrr intrrtupler*r r r r  s