Skip to content

Commit

Permalink
[WIP] revised issue codeforpdx#1063
Browse files Browse the repository at this point in the history
strictly for parsing district attorney number
made the new mebmer district_attorney_number a 'proper' member
...meaning it's no longer optional with a default value
...so constructors across the project have been revised, including in tests
did my best guessing when tests should have a blank DA number vs some value like 555
made other changes as suggested
  • Loading branch information
victorjz authored and KentShikama committed Jul 9, 2020
1 parent f05d2bf commit 9c61eb5
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 32 deletions.
3 changes: 2 additions & 1 deletion src/backend/expungeservice/crawler/crawler.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ def _search_record(session: Session, node_response, search_url, first_name, last
@staticmethod
def _read_case(session: Session, case_summary: CaseSummary) -> OeciCase:
case_parser_data = Crawler._parse_case(session, case_summary)
district_attorney_number = case_parser_data.district_attorney_number
balance_due_in_cents = CaseCreator.compute_balance_due_in_cents(case_parser_data.balance_due)
charges: List[OeciCharge] = []
for charge_id, charge_dict in case_parser_data.hashed_charge_data.items():
Expand All @@ -95,7 +96,7 @@ def _read_case(session: Session, case_summary: CaseSummary) -> OeciCase:
)
charges.append(charge)
updated_case_summary = replace(
case_summary, balance_due_in_cents=balance_due_in_cents, edit_status=EditStatus.UNCHANGED
case_summary, district_attorney_number=district_attorney_number, balance_due_in_cents=balance_due_in_cents, edit_status=EditStatus.UNCHANGED
)
return OeciCase(updated_case_summary, charges=tuple(charges))

Expand Down
17 changes: 9 additions & 8 deletions src/backend/expungeservice/crawler/parsers/case_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,18 @@

@dataclass
class CaseParserData:
district_attorney_number: str
hashed_charge_data: Dict[int, Dict[str, str]]
hashed_dispo_data: Dict[int, Dict[str, str]]
balance_due: str
probation_revoked: Optional[date]
distr_atty: str


class CaseParser:
@staticmethod
def feed(data) -> CaseParserData:
soup = BeautifulSoup(data, "html.parser")
distr_atty = CaseParser.__parse_distr_atty(soup)
district_attorney_number = CaseParser.__parse_district_attorney_number(soup)
hashed_charge_data = CaseParser.__build_charge_table_data(soup)
(
hashed_dispo_data,
Expand All @@ -39,18 +39,19 @@ def feed(data) -> CaseParserData:
probation_revoked = date.fromdatetime(datetime.strptime(probation_revoked_date_string, "%m/%d/%Y"))
else:
probation_revoked = None # type: ignore
return CaseParserData(hashed_charge_data, hashed_dispo_data, balance_due, probation_revoked, distr_atty)
return CaseParserData(district_attorney_number, hashed_charge_data, hashed_dispo_data, balance_due, probation_revoked)

@staticmethod
def __parse_distr_atty(soup) -> str:
distr_atty_key = "District Attorney Number:"
def __parse_district_attorney_number(soup) -> str:
district_attorney_key = "District Attorney Number:"
labels = soup.find_all("th", "ssTableHeaderLabel", limit=10)
table = {}
for tag in labels:
table[tag.string] = tag.parent.find("td").string
if distr_atty_key in table:
return table[distr_atty_key]
return ""
if district_attorney_key in table:
return table[district_attorney_key]
else:
return ""

@staticmethod
def __build_charge_table_data(soup) -> Dict[int, Dict[str, str]]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ def __record_case(self):
CaseCreator.create(
self.info,
self.case_number,
"", # district_attorney_number
self.citation_number,
self.date_location,
self.type_status,
Expand Down
8 changes: 4 additions & 4 deletions src/backend/expungeservice/models/case.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class CaseSummary:
name: str
birth_year: Optional[int]
case_number: str
district_attorney_number: str
citation_number: str
location: str
date: date_class
Expand All @@ -19,7 +20,6 @@ class CaseSummary:
case_detail_link: str
balance_due_in_cents: int
edit_status: EditStatus
distr_atty: str=""

def get_balance_due(self):
return self.balance_due_in_cents / 100
Expand Down Expand Up @@ -47,8 +47,8 @@ def empty(case_number: str):
CaseSummary(
name="",
birth_year=1900,
# distr_atty="",
case_number=case_number,
district_attorney_number="",
citation_number="",
location="",
date=date_class.today(),
Expand All @@ -71,7 +71,7 @@ class Case(OeciCase):
class CaseCreator:
@staticmethod
def create(
info, case_number, citation_number, date_location, type_status, case_detail_link, balance="0"
info, case_number, district_attorney_number, citation_number, date_location, type_status, case_detail_link, balance="0"
) -> CaseSummary:
name = info[0]
birth_year = CaseSummary._parse_birth_year(info)
Expand All @@ -84,6 +84,7 @@ def create(
name,
birth_year,
case_number,
district_attorney_number,
citation_number,
location,
date,
Expand All @@ -92,7 +93,6 @@ def create(
case_detail_link,
balance_due_in_cents,
EditStatus.UNCHANGED,
"", # distr_atty
)

@staticmethod
Expand Down
6 changes: 4 additions & 2 deletions src/backend/tests/factories/case_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ class CaseSummaryFactory:
def create(
info=["John Doe", "1990"],
case_number="1",
district_attorney_number="",
citation_number=None,
date_location=["1/1/1995", "Multnomah"],
type_status=["Offense Misdemeanor", "Closed"],
case_detail_link="?404",
balance="0",
) -> CaseSummary:
return CaseCreator.create(
info, case_number, citation_number, date_location, type_status, case_detail_link, balance
info, case_number, district_attorney_number, citation_number, date_location, type_status, case_detail_link, balance
)


Expand All @@ -22,6 +23,7 @@ class CaseFactory:
def create(
info=["John Doe", "1990"],
case_number="1",
district_attorney_number="",
citation_number=None,
date_location=["1/1/1995", "Multnomah"],
type_status=["Offense Misdemeanor", "Closed"],
Expand All @@ -30,6 +32,6 @@ def create(
balance="0",
) -> Case:
case_summary = CaseSummaryFactory.create(
info, case_number, citation_number, date_location, type_status, case_detail_link, balance
info, case_number, district_attorney_number, citation_number, date_location, type_status, case_detail_link, balance
)
return Case(case_summary, tuple(charges))
2 changes: 1 addition & 1 deletion src/backend/tests/models/test_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

class TestCaseBalanceDue(unittest.TestCase):
def test_balance_due_getter_setter(self):
case_args = [("John Doe", "1990"), "", "", ("1/1/2019", ""), ("", ""), ""]
case_args = [("John Doe", "1990"), "", "", "", ("1/1/2019", ""), ("", ""), ""]

case_1 = CaseCreator.create(*case_args, "123.45") # type: ignore
assert case_1.get_balance_due() == 123.45
Expand Down
32 changes: 16 additions & 16 deletions src/backend/tests/parser/test_case_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == ""
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == ""


class TestCaseWithoutFinancialTable(unittest.TestCase):
Expand Down Expand Up @@ -79,8 +79,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == "01234567"
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == "01234567"



Expand Down Expand Up @@ -125,8 +125,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == "555555-1"
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == "555555-1"


class TestCaseWithoutDisposition(unittest.TestCase):
Expand Down Expand Up @@ -163,8 +163,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == "2377315-1"
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == "2377315-1"


class TestParkingViolationCase(unittest.TestCase):
Expand All @@ -190,8 +190,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == ""
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == ""


class TestCaseWithRelatedCases(unittest.TestCase):
Expand Down Expand Up @@ -220,8 +220,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == "555555-B"
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == "555555-B"


class TestFelicia(unittest.TestCase):
Expand Down Expand Up @@ -257,8 +257,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert not self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == "555555"
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == "555555"


class TestRevokedProbation(unittest.TestCase):
Expand Down Expand Up @@ -294,8 +294,8 @@ def test_charge_data_is_formatted(self):
def test_probation_revoked_is_parsed(self):
assert self.parser.probation_revoked

def test_distr_atty_is_parsed(self):
assert self.parser.distr_atty == "55555555"
def test_district_attorney_number_is_parsed(self):
assert self.parser.district_attorney_number == "55555555"


class TestSpacesExistingInChargeInfoCells(unittest.TestCase):
Expand Down
2 changes: 2 additions & 0 deletions src/backend/tests/test_edit_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
name="John Doe",
birth_year=1980,
case_number="X0001",
district_attorney_number="555",
citation_number="X0001",
location="earth",
date=date(2001, 1, 1),
Expand Down Expand Up @@ -58,6 +59,7 @@
name="John Albert Doe",
birth_year=1970,
case_number="X0002",
district_attorney_number="555",
citation_number="X0002",
location="america",
date=date(1981, 1, 1),
Expand Down

0 comments on commit 9c61eb5

Please sign in to comment.