Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update with 2024 numbers #5

Merged
merged 2 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docassemble/PovertyScale/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '2023.0.0'
__version__ = '2024.0.0'
14 changes: 7 additions & 7 deletions docassemble/PovertyScale/data/sources/federal_poverty_scale.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"poverty_level_update_year": 2023,
"poverty_base": 14580,
"poverty_increment": 5140,
"poverty_base_hi": 16770,
"poverty_increment_hi": 5910,
"poverty_base_ak": 18210,
"poverty_increment_ak": 6430
"poverty_level_update_year": 2024,
"poverty_base": 15060,
"poverty_increment": 5380,
"poverty_base_ak": 18810,
"poverty_increment_ak": 6730,
"poverty_base_hi": 17310,
"poverty_increment_hi": 6190
}
49 changes: 25 additions & 24 deletions docassemble/PovertyScale/test_poverty.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,35 @@

class test_recreate_tables(unittest.TestCase):
def test_MA_100_table(self):
self.assertEqual(poverty_scale_get_income_limit(), 14580)
self.assertEqual(poverty_scale_get_income_limit(2), 19720)
self.assertEqual(poverty_scale_get_income_limit(3), 24860)
self.assertEqual(poverty_scale_get_income_limit(4), 30000)
self.assertEqual(poverty_scale_get_income_limit(5), 35140)
self.assertEqual(poverty_scale_get_income_limit(6), 40280)
self.assertEqual(poverty_scale_get_income_limit(7), 45420)
self.assertEqual(poverty_scale_get_income_limit(8), 50560)
self.assertEqual(poverty_scale_get_income_limit(), 15060)
self.assertEqual(poverty_scale_get_income_limit(2), 15060 + 5380)
self.assertEqual(poverty_scale_get_income_limit(3), 15060 + 5380*2)
self.assertEqual(poverty_scale_get_income_limit(4), 15060 + 5380*3)
self.assertEqual(poverty_scale_get_income_limit(5), 15060 + 5380*4)
self.assertEqual(poverty_scale_get_income_limit(6), 15060 + 5380*5)
self.assertEqual(poverty_scale_get_income_limit(7), 15060 + 5380*6)
self.assertEqual(poverty_scale_get_income_limit(8), 15060 + 5380*7)

def test_MA_125_table(self):
self.assertEqual(poverty_scale_get_income_limit(1, 1.25), 18225)
self.assertEqual(poverty_scale_get_income_limit(2, 1.25), 24650)
self.assertEqual(poverty_scale_get_income_limit(3, 1.25), 31075)
self.assertEqual(poverty_scale_get_income_limit(4, 1.25), 37500)
self.assertEqual(poverty_scale_get_income_limit(5, 1.25), 43925)
self.assertEqual(poverty_scale_get_income_limit(6, 1.25), 50350)
self.assertEqual(poverty_scale_get_income_limit(7, 1.25), 56775)
self.assertEqual(poverty_scale_get_income_limit(8, 1.25), 63200)
multiplier = 1.25
self.assertEqual(poverty_scale_get_income_limit(1, multiplier), 15060 * multiplier)
self.assertEqual(poverty_scale_get_income_limit(2, multiplier), (15060 + 5380) * multiplier)
self.assertEqual(poverty_scale_get_income_limit(3, multiplier), (15060 + 5380*2) * multiplier)
self.assertEqual(poverty_scale_get_income_limit(4, multiplier), (15060 + 5380*3) * multiplier)
self.assertEqual(poverty_scale_get_income_limit(5, multiplier), (15060 + 5380*4) * multiplier)
self.assertEqual(poverty_scale_get_income_limit(6, multiplier), (15060 + 5380*5) * multiplier)
self.assertEqual(poverty_scale_get_income_limit(7, multiplier), (15060 + 5380*6) * multiplier)
self.assertEqual(poverty_scale_get_income_limit(8, multiplier), (15060 + 5380*7) * multiplier)

def test_AK_100_table(self):
self.assertEqual(poverty_scale_get_income_limit(state="AK"), 18210)
self.assertEqual(poverty_scale_get_income_limit(2, state="ak"), 24640)
self.assertEqual(poverty_scale_get_income_limit(3, state="Ak"), 31070)
self.assertEqual(poverty_scale_get_income_limit(4, state="AK"), 37500)
self.assertEqual(poverty_scale_get_income_limit(5, state="AK"), 43930)
self.assertEqual(poverty_scale_get_income_limit(6, state="AK"), 50360)
self.assertEqual(poverty_scale_get_income_limit(7, state="AK"), 56790)
self.assertEqual(poverty_scale_get_income_limit(8, state="AK"), 63220)
self.assertEqual(poverty_scale_get_income_limit(state="AK"), 18810)
self.assertEqual(poverty_scale_get_income_limit(2, state="ak"), 18810 + 6730)
self.assertEqual(poverty_scale_get_income_limit(3, state="Ak"), 18810 + 6730*2)
self.assertEqual(poverty_scale_get_income_limit(4, state="AK"), 18810 + 6730*3)
self.assertEqual(poverty_scale_get_income_limit(5, state="AK"), 18810 + 6730*4)
self.assertEqual(poverty_scale_get_income_limit(6, state="AK"), 18810 + 6730*5)
self.assertEqual(poverty_scale_get_income_limit(7, state="AK"), 18810 + 6730*6)
self.assertEqual(poverty_scale_get_income_limit(8, state="AK"), 18810 + 6730*7)


class test_sample_incomes(unittest.TestCase):
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def find_package_data(where='.', package='', exclude=standard_exclude, exclude_d
return out

setup(name='docassemble.PovertyScale',
version='2023.0.0',
version='2024.0.0',
description=('A docassemble extension.'),
long_description='# PovertyScale\r\n\r\nPoverty scale, updated approximately on an annual basis, to use for calculating\r\nincome eligibility in the United States.\r\n\r\n[Just get the JSON file](https://github.com/SuffolkLITLab/docassemble-PovertyScale/blob/main/docassemble/PovertyScale/data/sources/federal_poverty_scale.json)\r\n\r\n## Justification\r\n\r\nhttps://github.com/codeforamerica/fplapi exists but requires a dedicated\r\nserver, and hasn\'t been updated in recent years. At Suffolk we are already\r\nmaintaining and consuming this information in multiple apps; it\'s simple \r\nfor us to maintain the API alongside it.\r\n\r\nThe intent is that you will run this on your own Docassemble server, but we may maintain a public endpoint\r\nat some point. If you run your own Docassemble server, this allows you have one\r\nsource of truth for both use in Docassemble interviews (without the overhead of the REST call)\r\nand for use in any non-Docassemble webapps you may have.\r\n\r\n## Update frequency\r\n\r\nThe Federal Poverty Guidelines are updated annually, but not usually published in the federal register until a month or so into a new year.\r\nWe will try to closely track that update timeline. Pull requests with updated figures are welcome.\r\n\r\n## Examples\r\n\r\nSee example and demo in demo_poverty_scale.yml\r\n\r\nThis package contains a JSON file, [federal_poverty_scale.json](https://github.com/SuffolkLITLab/docassemble-PovertyScale/blob/main/docassemble/PovertyScale/data/sources/federal_poverty_scale.json), which can be referenced directly,\r\nas well as a module poverty.py which exports `poverty_scale_income_qualifies`\r\n\r\n## REST API\r\n\r\nOnce this file is installed, you can access it as a REST API with\r\na JSON response. The following endpoints are created on your Docassemble\r\nserver:\r\n\r\n* /poverty_guidelines (same as the JSON file)\r\n* /poverty_guidelines/household_size/<n> (per-household size)\r\n* /poverty_guidelines/household_size/<n>?state=ak|hi&multiplier=2\r\n* /poverty_guidelines/qualifies/household_size/<household_size>?income=1000&state=AK&multiplier=1.5\r\n\r\nYou can just use the API endpoint to retrieve the contents of the JSON file,\r\nor specify a household size and optional state and multiplier to get a tailored\r\nresponse, with either the income limit for a given household size or a \r\ndetermination that someone\'s income is below the poverty guideline.\r\n\r\nIncome is expected to be provided on a monthly basis.\r\n\r\n## Python function signatures\r\n\r\n```python\r\ndef poverty_scale_income_qualifies(total_monthly_income:float, household_size:int=1, multiplier:int=1)->Union[bool,None]:\r\n """\r\n Given monthly income, household size, and an optional multiplier, return whether an individual\r\n is at or below the federal poverty level.\r\n \r\n Returns None if the poverty level data JSON could not be loaded.\r\n """\r\n \r\ndef poverty_scale_get_income_limit(household_size:int=1, multiplier:int=1)->Union[int, None]:\r\n """\r\n Return the income limit matching the given household size.\r\n """\r\n \r\n```\r\n',
long_description_content_type='text/markdown',
Expand Down