def _parse_flags(self, cmd_flag_map, args): """Expects arguments after the initial command and subcommands (i.e., the second item returned from _parse_subcmds) Returns a tuple of (multidict of flag names to parsed and validated values, remaining_args). Raises on unknown subcommands. """ flag_value_map = OMD() ff_path_res_map = OrderedDict() ff_path_seen = set() orig_args = args while args: arg = args[0] if not arg or arg[0] != '-' or arg == '-' or arg == '--': # posargs or post_posargs beginning ('-' is a conventional pos arg for stdin) break flag, value, args = self._parse_single_flag(cmd_flag_map, args) flag_value_map.add(flag.name, value) if flag is self.flagfile_flag: self._parse_flagfile(cmd_flag_map, value, res_map=ff_path_res_map) for path, ff_flag_value_map in ff_path_res_map.items(): if path in ff_path_seen: continue flag_value_map.update_extend(ff_flag_value_map) ff_path_seen.add(path) return flag_value_map, ff_path_res_map, args
class EventEmitter2(object): def __init__(self): """ """ self.events = OrderedMultiDict() self.on = self.add_listener self.off = self.remove_listener # TODO: Add listener to remove def add_listener(self, event, listener, count=0): if not (isinstance(listener, FunctionType)) or (isinstance(listener, BuiltinFunctionType)): raise Exception("Invalid Listener: %s" % (str(listener))) _event = re.compile(event) _listener = {"handler": listener, "calls": 0, "calls_left": count} self.events.add(_event, _listener) return True def emit(self, event, kwargs): for pattern, listener in self.events.iteritems(multi=True): if pattern.match(event): if not listener["calls_left"]: log.debug("Removing Listener: %s on Pattern: %s") % ( listener, pattern) self.remove_listener(pattern, listener) listener["calls"] += 1 listener["calls_left"] -= 1 yield listener["handler"](**kwargs) def remove_listener(self, pattern, listener): pattern = re.compile(pattern) listeners = self.events.getlist(pattern) for pattern, _listener in self.events.iteritems(multi=True): if _listener['handler'] == listener: listener = _listener break listeners = self.events.getlist(pattern) listeners.remove(listener) if len(listeners): self.events.update({pattern: listeners}) else: self.events._remove(pattern) return True def on_any(self, listener): raise NotImplementedError def off_any(self, listener): raise NotImplementedError def once(self, event, listener): self.add_listener(event, listener, left=1) def many(self, event, listener, left): self.add_listener(event, listener, left)
class EventEmitter2(object): def __init__(self): """ """ self.events = OrderedMultiDict() self.on = self.add_listener self.off = self.remove_listener # TODO: Add listener to remove def add_listener(self, event, listener, count=0): if (isinstance(listener, BuiltinFunctionType)): raise Exception("Invalid Listener: %s" % (str(listener))) _event = re.compile(event) _listener = {"handler": listener, "calls": 0, "calls_left": count} self.events.add(_event, _listener) return True def emit(self, event, kwargs): for pattern, listener in self.events.iteritems(multi=True): if pattern.match(event): if not listener["calls_left"]: log.debug("Removing Listener: %s on Pattern: %s") % ( listener, pattern) self.remove_listener(pattern, listener) listener["calls"] += 1 listener["calls_left"] -= 1 yield listener["handler"](**kwargs) def remove_listener(self, pattern, listener): pattern = re.compile(pattern) listeners = self.events.getlist(pattern) for pattern, _listener in self.events.iteritems(multi=True): if _listener['handler'] == listener: listener = _listener break listeners = self.events.getlist(pattern) listeners.remove(listener) if len(listeners): self.events.update({pattern: listeners}) else: self.events._remove(pattern) return True def on_any(self, listener): raise NotImplementedError def off_any(self, listener): raise NotImplementedError def once(self, event, listener): self.add_listener(event, listener, left=1) def many(self, event, listener, left): self.add_listener(event, listener, left)
def read_instructions() -> OrderedMultiDict[str, str]: instructions = OrderedMultiDict() instruction_regex = re.compile(r"\s(\w)\s") with open(INPUT_FILE, "r") as f_handle: for line in f_handle: if line: key, value = instruction_regex.findall(line.rstrip()) if key not in instructions: instructions[key] = value else: instructions.add(key, value) return instructions
def analyze_samples(): outcome = OrderedMultiDict() opcode = Opcode() methods = [ func for func in getmembers(Opcode, predicate=isfunction) if func[0] != "__init__" ] count = 0 for before, instruction, after in read_inputs(): outcome.clear() for opcode_method in methods: if getattr(opcode, opcode_method[0])(before, instruction) == after: outcome.add(instruction[0], opcode_method[0]) if len(outcome.getlist(instruction[0])) >= 3: count += 1 #print(outcome) print(count)
def epi_suite_values(epi_blob): '''Extracts some information as key-value pairs from EPI Suite output. Pretty rough (work in progress).''' data = OMD() try: lines = epi_blob.split('\n') for i in lines: j = i.strip() if j.startswith('Log Kow (') or j.startswith('Log BCF'): data.update(dict_from_line(i, '=')) if j.startswith('Henrys LC') or\ j.startswith('Log Koa (KOAWIN') or\ j.startswith('Log Koa (experimental') or\ j.startswith('Ready Biodegradability Prediction'): data.update(dict_from_line(i)) if 'Fugacity' in epi_blob: model_table = epi_blob.split('Level III Fugacity Model:', 1)[1] data.add('Level III Fugacity Model', model_table) except: pass return data
def cs_scrape_properties(csid, props=None): '''Retrieve some of the experimental and predicted chemical properties that are not surfaced in the ChemSpider web API.''' try: r = requests.get('http://www.chemspider.com/Chemical-Structure.{0}.html'.format(csid)) r.raise_for_status() except Exception as e: print(e) return None data = OMD([('CSID', csid)]) doc = BeautifulSoup(r.text, 'lxml') # Experimental and predicted properties ("Experimental data" tab): props_tabs = doc.find(id='suppInfoTab') try: props_found = props_tabs.find_all(class_='user_data_property_name') for p in props_found: prop_name = p.get_text().strip(': \r\n') if props is not None and prop_name not in props: continue li = p.find_parent('li') values = li.find_all('td') for i in values: value = i.get_text().strip() data.add(prop_name, value) except AttributeError: pass # ACD/Labs predicted properties: acd_tab = doc.find(id='acdLabsTab') try: acd_props = acd_tab.find_all(class_='prop_title') for p in acd_props: prop_name = p.get_text().strip(': \r\n') v = p.find_next_sibling('td') value = v.get_text().strip() if props is not None and prop_name not in props: continue # Make sure all predicted properties are obviously named if prop_name.startswith('ACD/') is False: prop_name = 'ACD/' + prop_name data.add(prop_name, value) except AttributeError: pass # EPI Suite results, as a blob to process later: # Sometimes only returns part of the text, for some reason. if props is not None and 'EPI Suite' not in props: pass else: epi_tab = doc.find(id='epiTab') epi_blob = epi_tab.get_text().strip() if epi_tab else None data.add('EPI Suite', epi_blob) return data