Skip to content

Commit

Permalink
Merge pull request #168 from fecgov/release/sprint-19
Browse files Browse the repository at this point in the history
Release/sprint 19
  • Loading branch information
toddlees authored Jan 30, 2023
2 parents 0eabc49 + 9467cb8 commit f0e28f9
Show file tree
Hide file tree
Showing 28 changed files with 5,241 additions and 121 deletions.
92 changes: 53 additions & 39 deletions bin/generate-spec-table.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@
import json

parser = argparse.ArgumentParser()
parser.add_argument('filename', help='filename of JSON schema doc to convert'
' to HTML table')
parser.add_argument(
"filename", help="filename of JSON schema doc to convert to HTML table"
)
args = parser.parse_args()

f = open(args.filename)
data = json.load(f)
f.close()

title = args.filename.split('.')[0]
title = args.filename.split(".")[0]

COLUMNS = [
"COL SEQ",
Expand All @@ -27,69 +28,82 @@
"VALUE REFERENCE",
"RULE REFERENCE",
"FIELD FORM ASSOCIATION",
"VALIDATION RULES"
"VALIDATION RULES",
]

if 'transaction_type_identifier' in data['properties']:
if "transaction_type_identifier" in data["properties"]:
COLUMNS = COLUMNS[1:]

print(f'<!DOCTYPE html><html lang="en"><head><title>{title}</title>'
'<link rel="stylesheet" href="spec_table.css"></head><body><table>'
f'<caption>Specification for {title}</caption><tr>')
print(
f'<!DOCTYPE html><html lang="en"><head><title>{title}</title>'
'<link rel="stylesheet" href="spec_table.css"></head><body><table>'
f"<caption>Specification for {title}</caption><tr>"
)

for c in COLUMNS:
print(f'<th>{c}</th>')
print('</tr>')
print(f"<th>{c}</th>")
print("</tr>")

for p in data['properties']:
print('<tr>')
for s in data['properties'][p]['fec_spec']:
if s == 'AUTO_POPULATE':
for p in data["properties"]:
print("<tr>")
for s in data["properties"][p]["fec_spec"]:
if s == "AUTO_POPULATE":
continue
value = data["properties"][p]["fec_spec"][s]
if not value:
value = ''
print(f'<td>{value}</td>')
validation_rules = '<ul>'
value = ""
print(f"<td>{value}</td>")
validation_rules = "<ul>"

if 'allOf' in data:
for all_of in data['allOf']:
if p in all_of['then']['required']:
if "allOf" in data:
for all_of in data["allOf"]:
if p in all_of["then"]["required"]:
conditions = []
for q in all_of['if']['properties']:
if 'const' in all_of['if']['properties'][q]:
for q in all_of["if"]["properties"]:
if "const" in all_of["if"]["properties"][q]:
conditions.append(
f"{q.upper()} equals "
f"{all_of['if']['properties'][q]['const']}")
if 'enum' in all_of['if']['properties'][q]:
f"{all_of['if']['properties'][q]['const']}"
)
if "enum" in all_of["if"]["properties"][q]:
conditions.append(
f"{q.upper()} one of "
f"{all_of['if']['properties'][q]['enum']}")
if 'minimum' in all_of['if']['properties'][q]:
f"{all_of['if']['properties'][q]['enum']}"
)
if "minimum" in all_of["if"]["properties"][q]:
conditions.append(
f"{q.upper()} >= "
f"{all_of['if']['properties'][q]['minimum']}")
f"{all_of['if']['properties'][q]['minimum']}"
)
validation_rules += f"<li>REQUIRED if {' & '.join(conditions)}</li>"

if p in data['required']:
if p in data["required"]:
validation_rules += "<li>REQUIRED</li>"
if 'type' in data['properties'][p]:
if "type" in data["properties"][p]:
validation_rules += f"<li>type: {data['properties'][p]['type']}</li>"
if 'const' in data['properties'][p]:
if "const" in data["properties"][p]:
validation_rules += f"<li>must equal: {data['properties'][p]['const']}</li>"
if 'enum' in data['properties'][p]:
if "enum" in data["properties"][p]:
validation_rules += f"<li>must be one of: {data['properties'][p]['enum']}</li>"
if 'minLength' in data['properties'][p]:
if "minLength" in data["properties"][p]:
validation_rules += f"<li>min length: {data['properties'][p]['minLength']}</li>"
if 'maxLength' in data['properties'][p]:
if "maxLength" in data["properties"][p]:
validation_rules += f"<li>max length: {data['properties'][p]['maxLength']}</li>"
if 'pattern' in data['properties'][p]:
if "pattern" in data["properties"][p]:
validation_rules += f"<li>regex: {data['properties'][p]['pattern']}</li>"
if 'minimum' in data['properties'][p]:
if "minimum" in data["properties"][p]:
validation_rules += f"<li>minimum: {data['properties'][p]['minimum']}</li>"
if 'maximum' in data['properties'][p]:
if "maximum" in data["properties"][p]:
validation_rules += f"<li>maximum: {data['properties'][p]['maximum']}</li>"
if "exclusiveMinimum" in data["properties"][p]:
validation_rules += (
f"<li>greater than: {data['properties'][p]['exclusiveMinimum']}</li>"
)
if "exclusiveMaximum" in data["properties"][p]:
validation_rules += (
f"<li>less than: {data['properties'][p]['exclusiveMaximum']}</li>"
)

print(f'<td>{validation_rules}</td>')
print('</tr>')
print('</table></body></html>')
print(f"<td>{validation_rules}</td>")
print("</tr>")
print("</table></body></html>")
18 changes: 18 additions & 0 deletions docs/PAC_RETURN.html

Large diffs are not rendered by default.

232 changes: 232 additions & 0 deletions docs/PAC_RETURN_spec.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
<!DOCTYPE html><html lang="en"><head><title>PAC_RETURN</title><link rel="stylesheet" href="spec_table.css"></head><body><table><caption>Specification for PAC_RETURN</caption><tr>
<th>FIELD DESCRIPTION</th>
<th>TYPE</th>
<th>REQUIRED</th>
<th>SAMPLE DATA</th>
<th>VALUE REFERENCE</th>
<th>RULE REFERENCE</th>
<th>FIELD FORM ASSOCIATION</th>
<th>VALIDATION RULES</th>
</tr>
<tr>
<td>FORM TYPE</td>
<td>A/N-8</td>
<td>X (error)</td>
<td>SA11C</td>
<td>SA11C Only</td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>must equal: SA11C</li></td>
</tr>
<tr>
<td>FILER COMMITTEE ID NUMBER</td>
<td>A/N-9</td>
<td>X (error)</td>
<td>C00123456</td>
<td></td>
<td>this is the ID of the Committee Account the report/transaction is associated with</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 9</li><li>max length: 9</li><li>regex: ^(?:[PC][0-9]{8}|[HS][0-9]{1}[A-Z]{2}[0-9]{5})$</li></td>
</tr>
<tr>
<td>TRANSACTION TYPE IDENTIFIER</td>
<td>A/N-12</td>
<td>X (error)</td>
<td>PAC_RETURN</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>must equal: PAC_RETURN</li></td>
</tr>
<tr>
<td>TRANSACTION ID</td>
<td>A/N-20</td>
<td>X (error)</td>
<td>A56123456789-1234</td>
<td></td>
<td>Must be unique for the life of a report (original + amendments) within each committee account. Letters, if included, must be uppercase.</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 20</li><li>regex: ^[ -~]{0,20}$</li></td>
</tr>
<tr>
<td>BACK REFERENCE TRAN ID NUMBER</td>
<td>A/N-20</td>
<td></td>
<td>A123456789-1234</td>
<td></td>
<td>Reference to the Tran ID of a Related Record</td>
<td></td>
<td><ul><li>type: ['string', 'null']</li><li>min length: 0</li><li>max length: 20</li><li>regex: ^[ -~]{0,20}$</li></td>
</tr>
<tr>
<td>BACK REFERENCE SCHED NAME</td>
<td>A/N-8</td>
<td></td>
<td>SA11AI</td>
<td>SA[line# ref]</td>
<td>Ref to the Schedule that has the Related Record. SA3L must be used
with the F3L</td>
<td></td>
<td><ul><li>type: ['string', 'null']</li><li>min length: 0</li><li>max length: 8</li><li>regex: ^[ -~]{0,8}$</li></td>
</tr>
<tr>
<td>ENTITY TYPE</td>
<td>A/N-3</td>
<td>X (error)</td>
<td>COM</td>
<td>COM only</td>
<td>[COM]</td>
<td></td>
<td><ul><li>REQUIRED</li><li>must equal: COM</li></td>
</tr>
<tr>
<td>CONTRIBUTOR ORGANIZATION</td>
<td>A/N-200</td>
<td>X (error)</td>
<td>John Smith & Co.</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 200</li><li>regex: ^[ -~]{0,200}$</li></td>
</tr>
<tr>
<td>CONTRIBUTOR STREET 1</td>
<td>A/N-34</td>
<td>X (error)</td>
<td>123 Main Street</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 34</li><li>regex: ^[ -~]{0,34}$</li></td>
</tr>
<tr>
<td>CONTRIBUTOR STREET 2</td>
<td>A/N-34</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><ul><li>type: ['string', 'null']</li><li>min length: 0</li><li>max length: 34</li><li>regex: ^[ -~]{0,34}$</li></td>
</tr>
<tr>
<td>CONTRIBUTOR CITY</td>
<td>A/N-30</td>
<td>X (error)</td>
<td>Anytown</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 30</li><li>regex: ^[ -~]{0,30}$</li></td>
</tr>
<tr>
<td>CONTRIBUTOR STATE</td>
<td>A/N-2</td>
<td>X (error)</td>
<td>WA</td>
<td>AK,AL,...,ZZ</td>
<td>Edit: ST</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 2</li><li>regex: ^[ -~]{0,2}$</li></td>
</tr>
<tr>
<td>CONTRIBUTOR ZIP</td>
<td>A/N-9</td>
<td>X (error)</td>
<td>981110123</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 9</li><li>regex: ^[ -~]{0,9}$</li></td>
</tr>
<tr>
<td>CONTRIBUTION DATE</td>
<td>NUM-8</td>
<td>X (error)</td>
<td>20120615</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 10</li><li>regex: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$</li></td>
</tr>
<tr>
<td>CONTRIBUTION AMOUNT</td>
<td>AMT-12</td>
<td>X (error)</td>
<td>-250</td>
<td></td>
<td>Negative amount</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: number</li><li>minimum: -99999999.99</li><li>less than: 0</li></td>
</tr>
<tr>
<td>CONTRIBUTION AGGREGATE</td>
<td>AMT-12</td>
<td>X (error)</td>
<td>1000</td>
<td></td>
<td>YTD</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: number</li><li>minimum: -99999999.99</li><li>maximum: 999999999.99</li></td>
</tr>
<tr>
<td>AGGREGATION GROUP</td>
<td>A/N-100</td>
<td>X (error)</td>
<td>GENERAL</td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>must equal: GENERAL</li></td>
</tr>
<tr>
<td>CONTRIBUTION PURPOSE DESCRIPTION</td>
<td>A/N-100</td>
<td>X (error)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 1</li><li>max length: 100</li><li>regex: ^[ -~]{0,100}$</li></td>
</tr>
<tr>
<td>DONOR COMMITTEE FEC ID</td>
<td>A/N-9</td>
<td>X (error)</td>
<td></td>
<td></td>
<td>Should populate with information from FEC database</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 9</li><li>regex: ^(?:[PC][0-9]{8}|[HS][0-9]{1}[A-Z]{2}[0-9]{5})$</li></td>
</tr>
<tr>
<td>DONOR COMMITTEE NAME</td>
<td>A/N-200</td>
<td>X (error)</td>
<td>Action PAC</td>
<td></td>
<td>Should populate with information from FEC database</td>
<td></td>
<td><ul><li>REQUIRED</li><li>type: string</li><li>min length: 0</li><li>max length: 200</li><li>regex: ^[ -~]{0,200}$</li></td>
</tr>
<tr>
<td>MEMO CODE</td>
<td>A/N-1</td>
<td></td>
<td></td>
<td>X</td>
<td>X = True</td>
<td></td>
<td><ul><li>type: ['boolean', 'null']</li></td>
</tr>
<tr>
<td>MEMO TEXT/DESCRIPTION</td>
<td>A/N-100</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><ul><li>type: ['string', 'null']</li><li>min length: 0</li><li>max length: 100</li><li>regex: ^[ -~]{0,100}$</li></td>
</tr>
</table></body></html>
Loading

0 comments on commit f0e28f9

Please sign in to comment.