def test_attending_members_invalid_data(self): # file does not exist with CommitteeMeetingProtocol.get_from_filename('/foo/bar/baz') as protocol: with self.assertRaises(IOError): protocol.find_attending_members([]) # no text with CommitteeMeetingProtocol.get_from_text(None) as protocol: self.assertEqual([], protocol.find_attending_members([]))
def test_missing_member_issue132(self): # TODO: switch to env_conditional_mock function when PR #9 is merged if os.environ.get("NO_MOCKS", "") == "1": all_mk_names = get_all_mk_names() else: all_mk_names = MOCK_OPEN_KNESSET_GET_ALL_MK_NAMES_RESPONSE mks, mk_names = all_mk_names with CommitteeMeetingProtocol.get_from_filename( os.path.join(os.path.dirname(__file__), '20_ptv_367393.doc')) as protocol: attending_members = protocol.find_attending_members(mk_names) self.assertEqual( attending_members, [ u"אוסאמה סעדי", u"אורי מקלב", u"זאב בנימין בגין", u"יוליה מלינובסקי", # this MK has extra space which caused him not to be found # now we search the stripped name # but the return value still has the extra space (as provided) u"מיכאל מלכיאלי ", u"רויטל סויד", u"בנימין בגין", ])
def test_docx_protocol_attendees(self): source_doc_file_name = os.path.join(os.path.dirname(__file__), '20_ptv_502208.doc') protocol_generator = CommitteeMeetingProtocol.get_from_filename(source_doc_file_name) with protocol_generator as protocol: self.assertEqual(['איתן כבל', 'יצחק וקנין', "עבד אל חכים חאג' יחיא", 'איתן ברושי', 'שרן השכל'], protocol.find_attending_members([u"איתן כבל", u"יצחק וקנין", u"עבד אל חכים חאג' יחיא", u"איתן ברושי", u"שרן השכל"])) self.assertEqual({'mks': ['איתן ברושי', 'שרן השכל', 'איתן כבל – היו"ר', 'יצחק וקנין', "עבד אל חכים חאג' יחיא"], 'invitees': [ {'name': 'צביקה כהן', 'role': 'סמנכ"ל בכיר למימון והשקעות, משרד החקלאות ופיתוח הכפר'}, {'name': 'אורי צוק-בר', 'role': 'סמנכ"ל מחקר כלכלה ואסטרטגיה, משרד החקלאות ופיתוח הכפר'}, {'name': 'אסף לוי', 'role': 'סמנכ"ל גורמי יצור, משרד החקלאות ופיתוח הכפר'}, {'name': 'דפנה טיש'}, {'name': 'עמרי איתן בן צבי'}, {'name': 'עדי טל נוסבוים'}, {'name': 'ליאורה עופרי'}, {'name': 'עו"ד, משרד החקלאות ופיתוח הכפר'}, {'name': 'עו"ד, מח\' יעוץ וחקיקה, משרד המשפטים'}, {'name': 'יועמ"ש, המשרד לביטחון פנים'}, {'name': 'עו"ד, המשרד להגנת הסביבה'}, {'name': 'צבי אלון', 'role': 'מנכ"ל, מועצת הצמחים'}, {'name': 'אמיר שניידר'}, {'name': 'ירון סולומון'}, {'name': 'יועמ"ש, התאחדות האיכרים והחקלאים בישראל'}, {'name': 'מנהל המחלקה להתיישבות, האיחוד החקלאי'}, {'name': 'אריאל ארליך', 'role': 'ראש מחלקת ליטיגציה, פורום קהלת'}, {'name': 'מיכל זליקוביץ', 'role': 'נציגה, פורום קהלת'}, {'name': 'יעל שביט', 'role': 'שדלן/ית'}], 'legal_advisors': ['איתי עצמון'], 'manager': ['לאה ורון']}, protocol.attendees)
def _filter_row(self, meeting_protocol, **kwargs): parts_relpath = os.path.join( str(meeting_protocol["committee_id"]), "{}.csv".format(meeting_protocol["meeting_id"])) text_relpath = os.path.join( str(meeting_protocol["committee_id"]), "{}.txt".format(meeting_protocol["meeting_id"])) parts_filename = self._get_filename(parts_relpath) text_filename = self._get_filename(text_relpath) protocol_filename = meeting_protocol["protocol_file"] protocol_ext = protocol_filename.strip()[-4:] if protocol_ext == ".doc": # for now, only doc files are being parsed and should be added to all_filenames if parts_relpath not in self._all_filenames: self._all_filenames += [parts_relpath, text_relpath] os.makedirs(os.path.dirname(parts_filename), exist_ok=True) if not os.path.exists(parts_filename): if protocol_ext == ".doc": with CommitteeMeetingProtocol.get_from_filename( protocol_filename) as protocol: with open(text_filename, "w") as f: f.write(protocol.text) logging.info( "parsed doc to text -> {}".format(text_filename)) with open(parts_filename, "w") as f: csv_writer = csv.writer(f) csv_writer.writerow(["header", "body"]) for part in protocol.parts: csv_writer.writerow([part.header, part.body]) logging.info( "parsed parts file -> {}".format(parts_filename)) elif protocol_ext == ".rtf": # rtf parsing proved difficult, skipping for now text_filename = None parts_filename = None # rtf_to_txt_filename = self._rtf_to_txt(protocol_filename) # shutil.copyfile(rtf_to_txt_filename, text_filename) # os.unlink(rtf_to_txt_filename) # logging.info("parsed rtf to text -> {}".format(text_filename)) # with open(text_filename) as f: # with CommitteeMeetingProtocol.get_from_text(f.read()) as protocol: # with open(parts_filename, "w") as f: # csv_writer = csv.writer(f) # csv_writer.writerow(["header", "body"]) # for part in protocol.parts: # csv_writer.writerow([part.header, part.body]) # logging.info("parsed parts file -> {}".format(parts_filename)) else: raise Exception("unknown extension: {}".format(protocol_ext)) yield { "committee_id": meeting_protocol["committee_id"], "meeting_id": meeting_protocol["meeting_id"], "protocol_file": protocol_filename, "text_file": text_filename, "parts_file": parts_filename }
def test_protocol_attendenace_strange_title(self): source_doc_file_name = os.path.join(os.path.dirname(__file__), '20_ptv_321195.doc') protocol_generator = CommitteeMeetingProtocol.get_from_filename( source_doc_file_name) with protocol_generator as protocol: self.assertEqual([u"קארין אלהרר", u"דוד אמסלם", u"אוסאמה סעדי"], protocol.find_attending_members([ u"קארין אלהרר", u"דוד אמסלם", u"אוסאמה סעדי" ]))
def _parse_doc_protocol(self, committee_id, meeting_id, protocol_filename, parts_filename, text_filename): try: with CommitteeMeetingProtocol.get_from_filename(protocol_filename) as protocol: with open(text_filename, "w") as f: f.write(protocol.text) logging.info("parsed doc to text -> {}".format(text_filename)) self._parse_protocol_parts(parts_filename, protocol) except (AntiwordException, subprocess.SubprocessError): logging.exception("committee {} meeting {}: failed to parse doc file, skipping".format(committee_id, meeting_id)) return False return True
def _parse_doc_protocol(self, committee_id, meeting_id, bucket, protocol_object_name, parts_object_name, text_object_name): logging.info("parsing doc protocol {} --> {}, {}".format(protocol_object_name, parts_object_name, text_object_name)) with object_storage.temp_download(self.s3, bucket, protocol_object_name) as protocol_filename: try: with CommitteeMeetingProtocol.get_from_filename(protocol_filename) as protocol: object_storage.write(self.s3, bucket, text_object_name, protocol.text, public_bucket=True) self._parse_protocol_parts(bucket, parts_object_name, protocol) except ( AntiwordException, # see https://github.com/hasadna/knesset-data-pipelines/issues/15 subprocess.SubprocessError, xml.etree.ElementTree.ParseError # see https://github.com/hasadna/knesset-data-pipelines/issues/32 ): logging.exception("committee {} meeting {}: failed to parse doc file, skipping".format(committee_id, meeting_id)) return False return True
def setUp(self): source_doc_file_name = os.path.join(os.path.dirname(__file__), '20_ptv_317899.doc') self.protocol_generator = CommitteeMeetingProtocol.get_from_filename(source_doc_file_name)
def test_protocol_attendenace_strange_title(self): source_doc_file_name = os.path.join(os.path.dirname(__file__), '20_ptv_321195.doc') protocol_generator = CommitteeMeetingProtocol.get_from_filename(source_doc_file_name) with protocol_generator as protocol: self.assertEqual([u"קארין אלהרר", u"דוד אמסלם", u"אוסאמה סעדי"], protocol.find_attending_members([u"קארין אלהרר", u"דוד אמסלם", u"אוסאמה סעדי"]))
def test_docx_protocol_parts(self): source_doc_file_name = os.path.join(os.path.dirname(__file__), '20_ptv_502208.doc') protocol_generator = CommitteeMeetingProtocol.get_from_filename( source_doc_file_name) with protocol_generator as protocol: self.assertProtocolPartEquals( protocol.parts[0], '', u"""פרוטוקול של ישיבת ועדה הכנסת העשרים הכנסת 12 ועדת הכלכלה 27/06/2018 מושב רביעי פרוטוקול מס' 800 מישיבת ועדת הכלכלה יום רביעי, י"ד בתמוז התשע"ח (27 ביוני 2018), שעה 9:00""") self.assertProtocolPartEquals( protocol.parts[1], u"""סדר היום""", u"""הצעת חוק מועצת הצמחים (ייצור ושיווק) (תיקון מס' 10), התשע"ד-2014""" ) self.assertProtocolPartEquals(protocol.parts[2], u"""נכחו""", u"""""") self.assertProtocolPartEquals( protocol.parts[3], u"""חברי הוועדה:""", u"""איתן כבל – היו"ר יצחק וקנין עבד אל חכים חאג' יחיא""") self.assertProtocolPartEquals(protocol.parts[4], u"""חברי הכנסת""", u"""איתן ברושי שרן השכל""") self.assertProtocolPartEquals(protocol.parts[5], u"""נכחו:""", u"""""") self.assertProtocolPartEquals( protocol.parts[6], u"""מוזמנים:""", u"""צביקה כהן - סמנכ"ל בכיר למימון והשקעות, משרד החקלאות ופיתוח הכפר אורי צוק-בר - סמנכ"ל מחקר כלכלה ואסטרטגיה, משרד החקלאות ופיתוח הכפר אסף לוי - סמנכ"ל גורמי יצור, משרד החקלאות ופיתוח הכפר דפנה טיש עמרי איתן בן צבי עדי טל נוסבוים ליאורה עופרי – – – – עו"ד, משרד החקלאות ופיתוח הכפר עו"ד, מח' יעוץ וחקיקה, משרד המשפטים יועמ"ש, המשרד לביטחון פנים עו"ד, המשרד להגנת הסביבה צבי אלון - מנכ"ל, מועצת הצמחים אמיר שניידר ירון סולומון – – יועמ"ש, התאחדות האיכרים והחקלאים בישראל מנהל המחלקה להתיישבות, האיחוד החקלאי אריאל ארליך - ראש מחלקת ליטיגציה, פורום קהלת מיכל זליקוביץ - נציגה, פורום קהלת יעל שביט - שדלן/ית""")
def setUp(self): source_doc_file_name = os.path.join(os.path.dirname(__file__), '20_ptv_317899.doc') self.protocol_generator = CommitteeMeetingProtocol.get_from_filename( source_doc_file_name)