PK!g<<vvtool/__init__.py# pylint: disable=unused-import """Top-level exports for vvtool.""" from .app import Member from .app import MemberNokkenPoole from .app import MemberNominate from .app import Person from .app import Rollcall from .app import RollcallNominate from .app import Vote from .app import connect __version__ = "0.1.2" PK! vvtool/app.py"""Representations of the Voteview data.""" from __future__ import annotations import datetime import typing as t import mongoengine import pymongo from mongoengine import fields class MemberNokkenPoole(mongoengine.EmbeddedDocument): """A member's Nokken-Poole score.""" dim1: float = fields.FloatField() dim2: float = fields.FloatField() number_of_votes: int = fields.IntField() class MemberNominate(mongoengine.EmbeddedDocument): """A member's Nominate statistics.""" number_of_votes: int = fields.IntField() number_of_errors: int = fields.IntField() dim1: float = fields.FloatField() dim2: float = fields.FloatField() total_number_of_votes: int = fields.IntField() geo_mean_probability: float = fields.FloatField() conditional: int = fields.IntField() log_likelihood: float = fields.IntField() class Person(mongoengine.Document): """A human person. A Person has one Member for each Congress. """ born: t.Optional[int] = fields.IntField() biography: t.Optional[str] = fields.StringField() id: str = fields.StringField() bioguide_id: t.Optional[str] = fields.StringField() died: t.Optional[int] = fields.IntField() bioname: str = fields.StringField() _id = fields.ObjectIdField() icpsr_list = fields.ListField(fields.IntField()) last_updated = fields.DateTimeField() meta = {"collection": "voteview_persons", "strict": False} class Member(mongoengine.Document): """An ICSPR-member-congress. Some persons get more than one ICPSR number and nominate score. The `Member` class corresponds to the ICPSR number and Congress, not a person. """ congress: int = fields.IntField() person_id: str = fields.ReferenceField(Person) state_abbrev: str = fields.StringField() nominate: MemberNominate = fields.EmbeddedDocumentField(MemberNominate) icpsr: int = fields.IntField() last_updated: datetime.datetime = fields.DateTimeField() member_id: str = fields.StringField(db_field="id") district_code: int = fields.IntField() party_code: int = fields.IntField() nokken_poole: MemberNokkenPoole = fields.EmbeddedDocumentField(MemberNokkenPoole) chamber: str = fields.StringField() meta = {"collection": "voteview_members", "strict": False} class RollcallNominate(mongoengine.EmbeddedDocument): """Nominate statistics of a rollcall.""" conditional: int = fields.IntField() spread: t.List[float] = fields.ListField(fields.IntField()) classified: float = fields.FloatField() log_likelihood: float = fields.FloatField() geo_mean_probability: float = fields.FloatField() pre: float = fields.FloatField() mid: t.List[float] = fields.ListField(fields.FloatField()) meta = {"strict": False} class Vote(mongoengine.EmbeddedDocument): """A single member's vote on a rollcall.""" cast_code = fields.IntField() icpsr = fields.IntField() prob = fields.FloatField() meta = {"strict": False} class Rollcall(mongoengine.Document): """A rollcall object.""" bill_number = fields.StringField() clerk_rollnumber = fields.IntField() congress = fields.IntField() session = fields.IntField() vote_desc = fields.StringField() vote_question = fields.StringField() rollnumber = fields.IntField() rollcall_id = fields.StringField(db_field="id") vote_type = fields.StringField() nominate = fields.EmbeddedDocumentField(RollcallNominate) vote_result = fields.StringField() date = fields.DateField() legis_num = fields.StringField() percent_support = fields.FloatField() chamber = fields.StringField() last_updated = fields.DateTimeField() votes = fields.ListField(fields.EmbeddedDocumentField(Vote)) meta = {"collection": "voteview_rollcalls", "strict": False} def connect( db_name: str = "voteview", host="127.0.0.1", port=27017 ) -> pymongo.database.Database: """Connect to a mongo database.""" return mongoengine.connect(db_name, host=host, port=port) PK!?ӵ vvtool/cli.py"""Command-line interface for Voteview database.""" import pathlib import alley import click PACKAGE_DIR = pathlib.Path(__file__).parent # pylint: disable=invalid-name cli = click.Group(help="Tools for the Voteview database.") @cli.group() @click.option( "--path", type=click.Path(exists=True, file_okay=False, writable=True, resolve_path=True), default=PACKAGE_DIR, ) @click.option("--database", "-d", required=True, help="The database name") @click.option("--username", "-u", help="The database user's username") @click.option("--password", "-w", help="The database user's password") @click.option("--host", "-h", help="The database host") @click.option("--port", "-p", type=int, help="The database port") @click.option("--auth", "-a", help="Authentication") @click.pass_context def migrate(ctx, path, database, username, password, host=None, port=None, auth=None): """Upgrade or downgrade the database with migrations.""" ctx.obj = alley.MongoMigrations( path, database, username, password, host=host, port=port, auth=auth ) @migrate.command() @click.pass_obj def status(ctx): """Check the current database migration status.""" migrations = ctx.migrations migrations.show_status() @migrate.command() @click.argument("name") @click.pass_obj def create(ctx, name): """Create a new migration. Specify a name for the migration. """ migrations = ctx.migrations migrations.create(name) @migrate.command() @click.argument("migration_id", required=False) @click.option("--dry-run", "fake", is_flag=True, help="Don't actually run it.") @click.pass_obj def up(ctx, migration_id, fake): """Upgrade the database to a specified migration.""" migrations = ctx.migrations migrations.up(migration_id, fake) @migrate.command() @click.argument("migration_id") @click.pass_obj def down(ctx, migration_id): """Downgrade the database to a specified migration.""" migrations = ctx.migrations migrations.down(migration_id) if __name__ == "__main__": cli() PK!hHRiivvtool/exceptions.py"""Custom exceptions for the module.""" class VoteviewException(Exception): """Base class for all Voteview exceptions.""" class DuplicateError(VoteviewException): """The value is a duplicate.""" class MissingReferent(VoteviewException): """The value is missing a referent.""" class NotFound(VoteviewException): """No match was found.""" PK!oovvtool/migrations/0001_trump.py"""Add initial Trump votes from Congressional Quarterly file.""" import csv import importlib.resources import typing as t import vvtool.migrations.data DATA_FILE = "initial_trump_votes.csv" TRUMP_ICPSR = 99912 def read_votes() -> t.List[t.Dict[str, str]]: """Read Trump vote records from the data file.""" with importlib.resources.open_text(vvtool.migrations.data, DATA_FILE) as file: return list(csv.DictReader(file)) def up(db=None): # pylint: disable=unused-argument """Add initial Trump votes from Congressional Quarterly file.""" for record in read_votes(): rollcall = vvtool.Rollcall.objects(rollcall_id=record["VoteviewID"]) new_vote = {"icpsr": TRUMP_ICPSR, "cast_code": 1} rollcall.update_one(push__votes=new_vote) def down(db=None): # pylint: disable=unused-argument """Remove initial Trump votes from Congressional Quarterly file.""" for trump_vote in read_votes(): rollcall = vvtool.Rollcall.objects(rollcall_id=trump_vote["VoteviewID"]) new_vote = {"icpsr": TRUMP_ICPSR, "cast_code": 1} rollcall.update_one(pull__votes=new_vote) PK!vvtool/migrations/__init__.pyPK!"vvtool/migrations/data/__init__.pyPK!яÝNN.vvtool/migrations/data/initial_trump_data.xlsxPK!bh^[Content_Types].xml (N0EHC-Jܲ@5*Q>ēƪc[iiBj7{2hnmƻR U^7/%rZY@1__fqR4DAJh>Vƹ Z9NV8ʩji){^-I"{v^P!XS)bRrKs(3`c07M4ZƐk+|\|z(P6h_-[@!Pk2n}?L %ddN"m,ǞDO97*~ɸ8Oc|nEB!$};{[2PK!U0#L _rels/.rels (MO0 HݐBKwAH!T~I$ݿ'TG~xl/_rels/workbook.xml.rels (RMK0 0wvt/"Uɴ)&!3~*]XK/oyv5+zl;obG s>,8(%"D҆4j0u2jsMY˴S쭂 )fCy I< y!+EfMyk K5=|t G)s墙UtB),fPK!=4Hxl/workbook.xmlU[o0~N @%UVi^'L ٦ITҵC |9GT\ "YEۛ]^!mAkѲmBG_BޮU bQyDZB6TT8bL7b8 -!=,y2 kDj*ީPywv. Vz;"㓛VH 񭍄;`hq'0٪J7"1xHvMdAV+x#h5h%}ss5Iע]6&S5j Tً=J#r>VJ< \߬akdK5KEA~}VsvZ Pu\28X/ZtN^ r.8fe)ٶfkLZ)sɓ= Pp{Gm7~`(QZZ0>ɾC"_<{~1l?,,vD\bOq<2sA{]=`&hbnF qϋeU3]qVO0SksBDx5/t 7 7o* L,b ' w1d̳S/#\ÝQˁP=[sSQ iӛXfyR!yg9sP醅! ߕB↞Sy6^N| #k^.2[.|SQoŰ3:c*! :Y;WPK!9Wd +xl/sharedStrings.xmlZRHOC1_=\:f w]u]% .'K硓ygzdLO~sfNuIʦ/>]}QyӕvYjt>M9B4磣|1;wIi-;]п~}ѫ|cLsGq78iv2+Kg;LퟥWq$'F^?9*NOR|i/^]n4=}V䐼}5aCipQ{2}>Kw&-SެKW j{$WwWgBj^egt?튍Zjo OƙeQ~jSϦ0^oozs[LD[u@ Qe597> D$z VfNЋ@s)U<۵U!zOɗi:SF8.+6!5ْ[vF1%?9 A'\oȥԂ+4g,kљKb` Yf bHtЖ Ƃ7! M}z^+Yp 7$4~PW#h܃1F򅰢CB\Sc/<9 HL-ܛw\0CLKі]F~ T唾ꌈ` M57oT=%[?j 5ȸ^{t͇LYyWC/fKxT45qLuHاj eGf⺫LN#02NNQR{;RV_d5lg0ѯ!x4ȭ7'=k(3*O="{ J ;vum/2CZ5,7o4POzJ}# Ymւ>c^j2&jVzABgu89VɈ!(†&,Ej6 ÚF7D@O$u1CHz c!}IrI H. cH捱հ.Gzoz@$68͆dX5F'VFVF,$BrlD1E17ƂHP7BP?0HHĩ7"4b:ٔ[;^ME%^dZ?'_Q ;$1agSlXdGL%d edRMRK 7HO"$"x$9$W3źBc\k;;(ZknH3kc̅F+hKBhcb Whh%*h8*S,UXD"0VRqƦ2al: $QL\͆X7$҄)4"ߗjp!=e!rST0RH'ROjlzb̥*DGR %LS^㊙ AK"f߈7" @){Zsfh6et-\ۃh MoEaj6t9Z3-BI a[Nrz"==|U  q( VU LT(*|$`8V\Ǯ- ٯr.>vvGɀy}uv<'f@P1Ng(&*f0e,P8V aAr. T䫰qLOrtv1r>ﱡ $6$a3Wd'TRhŒp2JHGCθiJۢ Vre1svM~o/L 텗Ŧ# PK!N xl/theme/theme1.xmlY͋7? sw5%l$dQV32%9R(Bo=@ $'#$lJZv G~ztҽzG ’_P=ؘ$Ӗk8(4|OHe n ,K۟~rmDlI9*f8&H#ޘ+R#^bP{}2!# J{O1B (W%òBR!a1;{(~h%/V&DYCn2L`|Xsj Z{_\Zҧh4:na PաWU_]נT E A)>\Çfgנ_[K^PkPDIr.jwd A)Q RSLX"7Z2>R$I O(9%o&`T) JU>#02]`XRxbL+7 /={=_*Kn%SSՏ__7'Ŀ˗:/}}O!c&a?0BĒ@v^[ uXsXa3W"`J+U`ek)r+emgoqx(ߤDJ]8TzM5)0IYgz|]p+~o`_=|j QkekZAj|&O3!ŻBw}ь0Q'j"5,ܔ#-q&?'2ڏ ZCeLTx3&cu+ЭNxNg x)\CJZ=ޭ~TwY(aLfQuQ_B^g^ٙXtXPꗡZFq 0mxEAAfc ΙFz3Pb/3 tSٺqyjuiE-#t00,;͖Yƺ2Obr3kE"'&&S;nj*#4kx#[SvInwaD:\N1{-_- 4m+W>Z@+qt;x2#iQNSp$½:7XX/+r1w`h׼9#:Pvd5O+Oٚ.<O7sig*t; CԲ*nN-rk.yJ}0-2MYNÊQ۴3, O6muF8='?ȝZu@,Jܼfw)t50+NRIS\IpDm OR}} Ҹ6%n+ HEAׄfX3ZuA*ؤ1uʏ^.e^{vƯ&1V.01Zf0Aq[Xev l lp[iP>[()9- reFUPYIゑ[w;Sl\a7%k s[$-^7C{忇EMn&ߍHU=e90O`k:k)Aւ3Ʉ 4:Rhkd[A-MZ7LP0样gخV PВyܿLal- ~GQHa|gY1w5txf v3{7d3fc'3fs' gy6nʠpZs?tlO`K`o$r#}{NvN8"cg<,(DY4yxww%M 3j "7A;%wBPK!i4% xl/worksheets/sheet1.xml]r8}߈*uu؞6U^rhK啪o 0Y9I@D̴m$2yq/<~pzz̮OOO?~z9=}zz:rO~?=x<_I O/ﯿܼ9>޽9};> xw>|x)=~fuW)u>~?6_O箒׻K_woRO_J~~:=U7YWMn<=>?^No.f{&{qoUUXHnq*ʖ<]o}Ww}7o_ΪjYӸûO]]=?޽-67ޅ___~|/|/ǯ__7n>;Q1 2Ec%qgM[!sQ%wm;o+մ1j9F4sLq,$9VV؄~P]/>rcuzoܩ1j9F4usJq,$9XƿVؐ{ v^|܏4֊徻6t޸gkc2hi/')$ӝ0v >93-; [SWro+1jIF4AMd%Irg0u `M|cΑan}x[ѨQK2 )&^+adI,7[PiDyػ V՜H+oG~][ N^vX4 +Sqfv2ܚZ9{=+xI C)RrP7{4q"9Уgv^9 KƈpSH!D$ӾUW%Zy%sbG{hh `5Ѭ̬R^+< YWtuAWY7s!}[SG %O H2I:!JRIiVEJSJ's2Y=cъ_YՇ#7&5L8YgbCHjJ9f><' z.zia&óY-#OҚUY1u̦;} g`w6>a5HZ(S|⡀ZGN1ӛjVaP`GAG{+NG+\ 2$'X&U.Xpȣ&3;)RNM|y gU$8tY378eO=bs;u[)L0#OқUޔ)szS<*nL~="|s}+̜ 0>IpVESJ N5[ ӂP gh5a7ja|ଊN1j#bc Zu*>%: 8;䧅F$8")zM5[I8UuxcB禼eW#[-'ru)sS͖3N{IDyjB7Cukt^7ia|⬋N1Sj7q}*K؆#y,룵m_d3-#O[Z553[_W-Yqzxȷ3wR &=`_-#ORuҩ6Sj~i-jcu֮7L-z' κHpJ9fK6Щ&u&C:5g#hmo080>IqESJ)N5[ri PeRh+A[C0KNG$9")S$fT{Ow*P'UBQgž5* 8Q >IqESJjy{S:!D>v}06?R-#|OeY$1威߱Igg 2|jvxx-'v-zDS')y”)Aʃ{Ow 0.yܝ`mw V}-8#oԆ[I.K)I㽧ͣ@+{),V܌wsy{gA;zw=I_.Nѝ՗jg @xzԺͱ uĊo{RsY$/tלּT;^;xf0ړ:m=ۜu{!MŋZG.ERJΪK4L|sPs6M]^7+6O<$u,RR:wV]o ioZB1߬իY!-x!'U }=iqvKxњ|-!gzMXl&8!.WERJΊK >oV&BѠzuxvEC} ߓH]JYuv#o^Cy heN[ G|s"g^^ǁ(9T.R$ןNLVc6;J< G)sX5z~=p6`9@p"uJKAr|H߀o0MoFkޗz;?{\K)OR_?ay hme=OXFz<Ϭ`-ߓH_JY}v|K7O z7ի9,ODcNly_Nҗ"})S|gڙx߬ͧ4B1B6o^9{YΣ;N޵=)y.R:EwV^B7q 9vBN׍An{Rr]$/tלּT;gVy-6_Gsܩ[^8%-#Oҗ"})Sgڙ~ ŀc!p^Sݚ#9:?IenTNUjxdx,35B1<-n}џ٧tHgJYvI_Oo5Bf5mf~p-3B$)R:ExVhՍw?BS DŽs"Se׍Gf1#O")Sgڙ~ &b Q]Jw|>IhnNjd~ &F=&խ=zu3E<$)ҙR:wVg3g{߬39c gµ=cޙp>IhnNjgx,4շ Gƨ[:/n9?s#O")Sg94@8 M@k-{LwEwb3?<$) y,Rҙ/Ơ!E6 wPS$KLD<4'"ngF$QfEO6.-qB<5^-N|N@zK]ǸOݬHIt{>{! \{N` ]&!fI"4_@|IZ͊Ī/$?+W{KCubC> [>,5Gxvwo{.h]Oȟ$\ݬHIڵ4ߤcC>[9i & zf-%&k|c 1'X7+Rx-͡)B~lȫS|X&k "7H"W2C|IzVN-$m)7Sl94)Q .A=';| `&0^#ueV)CZ:hᚷMlg~R%4D}Vs<4Nb|)$?nҙQ>hC j,.h(dˆ*qTǸn]IV-, `E|p }9Ǜ'?O9Ε>+RK7*-?kތ*-AYIm&{ eZ ii֕[)>/o1}lȿp튺_nɊڜ>ϊkQuS3LJ$yyp>srw oD 2ꁑ^w (_-+R[^(;7Sz}ݍXP!%ueV'ϦlŒH9ipE!m=35]c/\*}B>WK4}[[)"הѷKq`Bz|hB>(Kn8_NŐF޷`UIbI!` oy +wA0I׻1 |V<'~5 *ӷRhQC/Du@jW4.wnƭW`S-YP ,0mr<A3Q_·5(> WD.IDneWK Ӂ0偷*Wطc} _;ŀ7BEdLVi+P}\Pe!˒S'kSVVήͰ_دdO-ywNPe0<۲ G0;_"\+`˜h}NgAL#B$eBN ]%ocCYa>$r c&QsƼ,67-iU뚅z;#= 'W.I˴nֺeWK^-=h]'ArQ'˻l.MbH3K'W.IˤneWKl eyylORw||}Vi+R$eRNK]쫥]7'i uyX' Biֈ⏛ H]“I:-uʲR:PVhR>I]rP9mnc_'/uZ e_-W,e)m.'}5g>VwDokfl1LJ$y[nA-5}R KM!B+)]“MLBWlWKeٚRˬY|{|#wmZQo1U\U_7}+{^xbDE$L:W,j qiS|ДtIo\>ϊ~_ѹ'/ӹ(~gYsP؇.'d}Дl/! x:-=`wEO \“yZ eyX Ya4%'}ҹ9fG;7ÛWt.It=Oyn:ApЋUgEC7 ?n$LxEZ }gl3t.ޯëȜԣ#e;[)$ya“ϠD o>y>=UpTɨJTT)JRQ7d( G7/_ssw||z>~~}y]т>>=NOQ.v}rz:|t>|:?_?ߎ/Rv_~xzz,a/ϧo<ڟNחݧ<iOs_m}PK!`M{docProps/core.xml (]K0C}~L@eW7Bv 6$n޴/s'缤mE|\%QT1.%Z-H$hͪˋ*Fi0 ϟK_5TqT NvS]s ʂ)fC[s/6<,QAysTqr7a:Yq~q2E.>Ϳig=1;%UϾK PK!^YdocProps/app.xml (Mo0  9mQ bHWbvgNc$Ovڍ/^>+zLdrQ J<.?| .xIOjB*2ǕdZs i4}0ozWey+k/PL״fࣗ1f`ίO֤@ - :%29hޒ.jk: 8B%? aXl"z^h8쯼+Q=$ 3 1v8!RȤdL1k籽Qs`09βCl ?sap4s7>9O{wy^TN>cdrɺ]wc8vQ^_g5%?ZPK-!bh^[Content_Types].xmlPK-!U0#L _rels/.relsPK-!>xl/_rels/workbook.xml.relsPK-!=4Hxl/workbook.xmlPK-!9Wd + xl/sharedStrings.xmlPK-!N xl/theme/theme1.xmlPK-!" om *xl/styles.xmlPK-!i4% S!xl/worksheets/sheet1.xmlPK-!`M{FdocProps/core.xmlPK-!^YAIdocProps/app.xmlPK LPK! ,,.vvtool/migrations/data/initial_trump_votes.csv,Year,Chamber,CQ Vote,Topic,Bill,Date,Yea,No,VoteviewID,PP,pWinLoss 0,2017,House,65,Abortion funding,HR7,2017-01-24,238,183,RH1150064,Y,W 1,2017,House,72,Financial regulation,HJR 41,2017-02-01,235,187,RH1150071,Y,W 2,2017,House,73,Environmental regulation,HJR 38,2017-02-01,228,194,RH1150072,Y,W 3,2017,House,76,Labor regulation,HJR 37,2017-02-02,236,187,RH1150075,Y,W 4,2017,House,77,Firearms regulation,HJR 40,2017-02-02,235,180,RH1150076,Y,W 5,2017,House,78,Environmental regulation,HJR 36,2017-02-03,221,191,RH1150077,Y,W 6,2017,House,83,Public Lands,HJR 44,2017-02-07,234,186,RH1150082,Y,W 7,2017,House,84,Education policy,HJR 57,2017-02-07,234,190,RH1150083,Y,W 8,2017,House,85,Education policy,HJR 58,2017-02-07,240,181,RH1150084,Y,W 9,2017,House,97,Labor regulation,HJR 42,2017-02-15,236,189,RH1150096,Y,W 10,2017,House,121,labor regulation,HJR 83,2017-03-01,231,191,RH1150120,Y,W 11,2017,House,136,Appropriations,HR1301,2017-03-08,371,48,RH1150135,Y,W 12,2017,House,184,Health care policy,HR 372,2017-03-22,416,7,RH1150183,Y,W 13,2017,House,186,Health care policy,HR 1101,2017-03-22,236,175,RH1150185,Y,W 14,2017,House,202,Telecommunications regulation,SJR 34,2017-03-28,215,205,RH1150201,Y,W 15,2017,House,244,Labor regulation,HR 1180,2017-05-02,229,197,RH1150243,Y,W 16,2017,House,249,Appropiations,HR 224,2017-05-03,309,118,RH1150248,Y,W 17,2017,House,256,Health care policy,HR 1628,2017-05-04,217,213,RH1150255,Y,W 18,2017,House,306,Health care policy,HR 2581,2017-06-13,238,184,RH1150305,Y,W 19,2017,House,307,Veterans affairs,S 1094,2017-06-13,368,55,RH1150306,Y,W 20,2017,House,337,Tort law,HR 1215,2017-06-28,218,210,RH1150336,Y,W 21,2017,House,342,Immigration policy,HR 3003,2017-06-29,228,195,RH1150341,Y,W 22,2017,House,344,Immigration policy,HR 3004,2017-06-29,257,167,RH1150343,Y,W 23,2017,House,412,Labor regulation,HJR 111,2017-07-25,231,190,RH1150411,Y,W 24,2017,House,480,Disaster supplement,HR 601,2017-09-08,316,90,RH1150479,Y,W 25,2017,House,517,Immigration policy,HR 3697,2017-09-14,233,175,RH1150516,Y,W 26,2017,House,528,Appropiations,HR 3354,2017-09-14,211,198,RH1150527,Y,W 27,2017,House,542,Appropiations,HR 3823,2017-09-28,264,155,RH1150541,Y,W 28,2017,House,549,Abortion rights,HR 36,2017-10-03,237,189,RH1150548,Y,W 29,2017,House,604,Health care policy,HR 849,2017-11-02,307,111,RH1150603,Y,W 30,2017,House,630,Flood insurance,HR 2874,2017-11-14,237,189,RH1150629,Y,W 31,2017,House,637,Tax overhaul,HR 1,2017-11-16,227,205,RH1150636,Y,W 32,2017,House,670,Appropriations,HJR 123,2017-12-07,235,193,RH1150669,Y,W 33,2017,House,692,Tax overhaul,HR 1,2017-12-19,227,203,RH1150691,Y,W 34,2017,House,699,Tax overhaul,HR 1,2017-12-20,224,201,RH1150698,Y,W 35,2017,House,708,Appropriations,HR 1370,2017-12-21,231,188,RH1150707,Y,W 36,2017,Senate,43,Environmental regulation,HJR 38,2017-02-02,54,45,RS1150043,Y,W 37,2017,Senate,51,Financial regulation,HJR 41,2017-02-03,52,47,RS1150051,Y,W 38,2017,Senate,66,Firearms regulation,HJR 40,2017-02-15,57,43,RS1150066,Y,W 39,2017,Senate,81,Labor regulation,HJR 37,2017-03-06,49,48,RS1150081,Y,W 40,2017,Senate,82,Public lands,HJR 44,2017-03-07,51,48,RS1150082,Y,W 41,2017,Senate,83,Education policy,HJR 58,2019-03-08,59,40,RS1150083,Y,W 42,2017,Senate,84,Education policy,HJR 57,2017-03-09,50,49,RS1150084,Y,W 43,2017,Senate,87,Labor regulation,HJR 42,2017-03-14,51,48,RS1150087,Y,W 44,2017,Senate,93,Labor regulation,HJR 83,2017-03-22,50,48,RS1150093,Y,W 45,2017,Senate,99,Labor regulation,HJR 67,2017-03-30,50,49,RS1150099,Y,W 46,2017,Senate,109,Senate procedure,,2017-04-06,48,52,RS1150109,N,W 47,2017,Senate,120,Labor regulation,HJR 66,2017-05-03,50,49,RS1150120,Y,W 48,2017,Senate,121,Appropiations,HR 244,2017-05-04,79,18,RS1150121,Y,W 49,2017,Senate,167,Health care ,HR 1628,2017-07-25,50,50,RS1150167,Y,W 50,2017,Senate,169,Health care policy,HR 1628,2017-07-26,45,55,RS1150169,Y,L 51,2017,Senate,179,Health care policy,HR 1628,2017-07-28,49,51,RS1150179,Y,L 52,2017,Senate,192,Disaster supplement,HR 601,2017-09-07,80,17,RS1150192,Y,W 53,2017,Senate,219,Budget resolution,HR 71,2017-10-17,50,47,RS1150219,Y,W 54,2017,Senate,249,Financial regulation,HJR 111,2017-10-24,50,50,RS1150249,Y,W 55,2017,Senate,303,Tax overhaul,HR 1,2017-12-02,51,49,RS1150303,Y,W 56,2017,Senate,311,Appropriations,HJR 123,2017-12-07,81,14,RS1150311,Y,W 57,2017,Senate,323,Tax overhaul,HR 1,2017-12-20,51,48,RS1150323,Y,W 58,2017,Senate,325,Appropriations,HR 1370,2017-12-21,66,32,RS1150325,Y,W 59,2017,Senate,29,James Mattis,PN29,2017-01-20,98,1,RS1150029,Y,W 60,2017,Senate,30,John F. Kelly,PN40,2017-01-20,88,11,RS1150030,Y,W 61,2017,Senate,32,Mike Pompeo,PN43,2017-01-23,66,32,RS1150032,Y,W 62,2017,Senate,33,Nikki R. Haley,PN50,2017-01-24,96,4,RS1150033,Y,W 63,2017,Senate,35,Elaine L. Chao,PN35,2017-01-31,93,6,RS1150035,Y,W 64,2017,Senate,36,Rex W. Tillerson,PN25,2017-02-01,56,43,RS1150036,Y,W 65,2017,Senate,54,Elisabeth Prince DeVos,PN37,2017-02-07,50,50,RS1150054,Y,W 66,2017,Senate,59,Jeff Sessions,PN30,2017-02-08,52,47,RS1150059,Y,W 67,2017,Senate,61,Thomas Price,PN33,2017-02-10,52,47,RS1150061,Y,W 68,2017,Senate,63,Steven T. Mnuchin,PN26,2017-02-10,53,47,RS1150063,Y,W 69,2017,Senate,64,David J. Shulkin,PN39,2017-02-13,100,0,RS1150064,Y,W 70,2017,Senate,65,Linda E. McMahon,PN48,2017-02-14,81,19,RS1150065,Y,W 71,2017,Senate,68,Mick Mulvaney,PN54,2017-02-16,51,49,RS1150068,Y,W 72,2017,Senate,71,Scott Pruit,PN44,2017-02-17,52,46,RS1150071,Y,W 73,2017,Senate,73,Wilbur Ross,PN32,2017-02-27,72,27,RS1150073,Y,W 74,2017,Senate,75,Ryan Zinke,PN31,2017-03-01,68,37,RS1150075,Y,W 75,2017,Senate,77,"Benjamin S. Carson, Sr.",PN 34,2017-03-02,58,41,RS1150077,Y,W 76,2017,Senate,79,James Richard Perry,PN 36,2017-03-02,62,37,RS1150079,Y,W 77,2017,Senate,86,Seema Verma,PN 49,2017-03-13,55,43,RS1150086,Y,W 78,2017,Senate,89,Daniel Coats,PN 41,2017-03-15,85,12,RS1150089,Y,W 79,2017,Senate,90,"Herbert R. McMaster, Jr.",PN 90,2017-03-15,86,10,RS1150090,Y,W 80,2017,Senate,91,Charles R. Bryer & Danny C. Reeves,PN 86,2017-03-21,98,0,RS1150091,Y,W 81,2017,Senate,96,David Friedman,PN 53,2017-03-23,52,46,RS1150096,Y,W 82,2017,Senate,103,Elaine C. Duke,PN 59,2017-04-04,85,14,RS1150103,Y,W 83,2017,Senate,111,Neil M. Gorsuch,PN 55,2017-04-07,54,45,RS1150111,Y,W 84,2017,Senate,112,Sonny Perdue,PN 90,2017-04-24,87,11,RS1150112,Y,W 85,2017,Senate,114,Rod J. Rosentein,PN 56,2017-04-25,94,6,RS1150114,Y,W 86,2017,Senate,116,R. Alexander Acosta,PN 88,2017-04-27,60,38,RS1150116,Y,W 87,2017,Senate,118,Jay Clayton,PN 47,2017-05-02,61,37,RS1150118,Y,W 88,2017,Senate,122,Heather Wilson,PN 101,2017-05-08,76,22,RS1150122,Y,W 89,2017,Senate,124,Scott Gottlieb,PN 118,2017-05-09,57,42,RS1150124,Y,W 90,2017,Senate,127,Robert Lighthzier,PN 42,2017-05-11,82,14,RS1150127,Y,W 91,2017,Senate,129,Jeffrey A. Rosen,PN 102,2017-05-16,56,42,RS1150129,Y,W 92,2017,Senate,131,Rachel L. Brand,PN 57,2017-05-18,52,46,RS1150131,Y,W 93,2017,Senate,133,Terry Branstad,PN 52,2017-05-22,82,13,RS1150133,Y,W 94,2017,Senate,135,John J. Sullivan,PN 350,2017-05-24,94,6,RS1150135,Y,W 95,2017,Senate,137,Amul R. Tharpar,PN 105,2017-05-24,52,44,RS1150137,Y,W 96,2017,Senate,139,Courtney Elwood,PN 104,2017-06-06,67,33,RS1150139,Y,W 97,2017,Senate,141,Scott P. Brown,PN 349,2017-06-08,94,4,RS1150141,Y,W 98,2017,Senate,142,Kenneth P. Rapuano,PN 348,2017-06-12,95,1,RS1150142,Y,W 99,2017,Senate,148,Brock Long,PN 455,2017-06-20,95,4,RS1150148,Y,W 100,2017,Senate,150,Sigal Mandelker,PN 172,2017-06-21,96,4,RS1150150,Y,W 101,2017,Senate,152,Marshall Billingslea,PN 366,2017-06-22,65,35,RS1150152,Y,W 102,2017,Senate,154,Kristne L. Svinicki,PN 561,2017-06-26,88,9,RS1150154,Y,W 103,2017,Senate,156,Neomi Rao,PN 478,2017-07-10,54,41,RS1150156,Y,W 104,2017,Senate,158,David C. Nye,PN 373,2017-07-12,100,0,RS1150158,Y,W 105,2017,Senate,160,William Francis Hagerty IV,PN 117,2017-07-13,86,12,RS1150160,Y,W 106,2017,Senate,162,Patrick M. Shanahan,PN 583,2017-07-18,92,7,RS1150162,Y,W 107,2017,Senate,164,John Kenneth Bush,PN 370,2017-07-20,51,47,RS1150164,Y,W 108,2017,Senate,166,David Bernhardt,PN 365,2017-07-24,53,43,RS1150166,Y,W 109,2017,Senate,181,Christopher A. Wray,PN 696,2017-08-01,92,5,RS1150181,Y,W 110,2017,Senate,182,Kevin Christopher Newsom,PN 372,2017-08-01,66,31,RS1150182,Y,W 111,2017,Senate,184,Marvin Kaplan,PN 681,2017-08-02,50,48,RS1150184,Y,W 112,2017,Senate,186,Dan R. Brouilette ,PN 459,2017-08-03,79,17,RS1150186,Y,W 113,2017,Senate,188,Timothy J. Kelly,PN 588,2017-09-05,94,2,RS1150188,Y,W 114,2017,Senate,194,Kevin Allen Hassett,PN 457,2017-09-12,81,16,RS1150194,Y,W 115,2017,Senate,196,Pamela Hughes Patenaude,PN 363,2017-09-14,80,17,RS1150196,Y,W 116,2017,Senate,201,Noel J. Francisco,PN 299,2017-09-19,50,47,RS1150201,Y,W 117,2017,Senate,203,William J. Emanuel,PN 725,2017-09-25,49,47,RS1150203,Y,W 118,2017,Senate,204,Heath P. Tarbert,PN 173,2017-09-27,87,8,RS1150204,Y,W 119,2017,Senate,205,Makan Delrahim,PN 249,2017-09-27,73,21,RS1150205,Y,W 120,2017,Senate,207,Ralph R. Erickson,PN 586,2017-09-28,95,1,RS1150207,Y,W 121,2017,Senate,209,Ajit Varadaraj Pai,PN 89,2017-10-02,52,41,RS1150209,Y,W 122,2017,Senate,211,Eric D. Hargan,PN 248,2017-10-04,57,38,RS1150211,Y,W 123,2017,Senate,213,Randal Quarles,PN 734,2017-10-05,65,32,RS1150213,Y,W 124,2017,Senate,215,Lee Francis Cissna,PN 352,2017-10-05,54,43,RS1150215,Y,W 125,2017,Senate,217,Callista L. Gingrich,PN 523,2017-10-16,70,23,RS1150217,Y,W 126,2017,Senate,218,David Joel Trachtenberg,PN 362,2017-10-17,79,17,RS1150218,Y,W 127,2017,Senate,251,Scott L. Palk,PN 374,2017-10-26,79,16,RS1150251,Y,W 128,2017,Senate,253,Trevor N. McFadden,PN 589,2017-10-30,84,10,RS1150253,Y,W 129,2017,Senate,255,Amy Coney Barrett,PN 369,2017-10-31,55,43,RS1150255,Y,W 130,2017,Senate,257,Joan Louise Larsen,PN 371,2017-11-01,60,38,RS1150257,Y,W 131,2017,Senate,259,Allison H. Eid,PN 585,2017-11-02,56,41,RS1150259,Y,W 132,2017,Senate,261,Stephanos Bibas,PN 679,2017-11-02,55,43,RS1150261,Y,W 133,2017,Senate,262,John H. Gibson II,PN 669,2017-11-07,91,7,RS1150262,Y,W 134,2017,Senate,264,Steven Andrew Engel,PN 58,2017-11-07,51,47,RS1150264,Y,W 135,2017,Senate,266,Peter B. Robb,PN 1025,2017-11-08,49,46,RS1150266,Y,W 136,2017,Senate,268,William L. Wehrum,PN 994,2017-11-09,49,47,RS1150268,Y,W 137,2017,Senate,270,Derek Kan,PN 458,2017-11-13,90,7,RS1150270,Y,W 138,2017,Senate,272,Steven Gill Bradbury,PN 558,2017-11-14,50,47,RS1150272,Y,W 139,2017,Senate,274,Mark T. Esper,PN 811,2017-11-15,89,6,RS1150274,Y,W 140,2017,Senate,275,David G. Zatezalo,PN 919,2017-11-15,52,46,RS1150275,Y,W 141,2017,Senate,277,Joseph Otting,PN 556,2017-11-16,54,43,RS1150277,Y,W 142,2017,Senate,280,"Donald C. Coggins, Jr.",PN 875,2017-11-16,96,0,RS1150280,Y,W 143,2017,Senate,281,Dabney Langhorne Friedrich,PN 587,2017-11-27,97,3,RS1150281,Y,W 144,2017,Senate,283,Gregory G. Katsas,PN 999,2017-11-28,50,48,RS1150283,Y,W 145,2017,Senate,305,Kirstejen Nielsen,PN 1095,2017-12-05,62,37,RS1150305,Y,W 146,2017,Senate,310,Joseph Balash,PN 814,2017-12-07,61,38,RS1150310,Y,W 147,2017,Senate,313,Leonard Steven Grasz,PN 878,2017-12-12,50,48,RS1150313,Y,W 148,2017,Senate,315,Don R. Willett,PN 1077,2017-12-13,50,47,RS1150315,Y,W 149,2017,Senate,317,James C. Ho,PN 1108,2017-12-14,53,43,RS1150317,Y,W 150,2017,Senate,318,"J. Paul Compton, Jr.",PN 514,2017-12-18,62,34,RS1150318,Y,W 151,2017,Senate,319,Owen West,PN 555,2017-12-18,74,23,RS1150319,Y,W 152,2017,Senate,320,Jennifer Gillian Newstead,PN 914,2017-12-19,88,11,RS1150320,Y,W PK!H=%)-voteview_dev-0.1.2.dist-info/entry_points.txtN+I/N.,()*++ϱPz9V@PK!$voteview_dev-0.1.2.dist-info/LICENSEPK!HڽTU"voteview_dev-0.1.2.dist-info/WHEEL A н#Z;/"d&F[xzw@Zpy3Fv]\fi4WZ^EgM_-]#0(q7PK!H5NS %voteview_dev-0.1.2.dist-info/METADATAVQS8~ׯJ t%ws\4i{QU\I6d+91=o?} H74V"}F"jxXx}6\E ߖ H4E4R@Cs#dRduz.e] VnM N E b3JV A#QNpٙD86:3"e(t@LoÇCiS I`v%uGk4 @.2EM%q\j8!c(XÆh#KG iZEEIK"cc'ˋ]p"sND E#'f ]u,JưB=DĆ{vsh ;#jZ;9}LOsDEw[6h9f;A sr@0PFV އI6bA~0wqgPn~kJG f~nF DFfH֤ EyCTHP^g%r{ lU K_Zi@Gg*m+nK%2dcFj^Z.J٫;ٚb|fkL *7kс6xM`&ݼ:I8[&BV*>SFJarI6_{9[FXh/ТLJVbI ~Tpݞׯu{ 76O 磯p51jF ;_փ. Jt Ay)K*`!su)X~ZbJuLU}Wo:clD蝙yS<|ռ)1:ohZ] 3 VT Bw-T>tVd{Yt0{dpx5NN""#QlXK|Eͳ/P64PK!H)-h#voteview_dev-0.1.2.dist-info/RECORDIP}E (ʆz'y_.S.,.Sa}!,`ꆵ)Xk&n`_LZc}^pӗT`4} g) 5C _yGo֦DR?!&!ؿJ'|-{#(Hώ!}{&Uj/Q`\#O($ST, [G6R3'C2|9pR 떼L }`4G>^$ ϟ?]AÖ"fGbՙϷ6WlǍ&"0~쪫Y=-qV~8YZfN^c 2o]}WO #;Ъ~PK!g<<vvtool/__init__.pyPK! lvvtool/app.pyPK!?ӵ ovvtool/cli.pyPK!hHRiivvtool/exceptions.pyPK!oo3vvtool/migrations/0001_trump.pyPK!vvtool/migrations/__init__.pyPK!" vvtool/migrations/data/__init__.pyPK!яÝNN.Z vvtool/migrations/data/initial_trump_data.xlsxPK! ,,.Covvtool/migrations/data/initial_trump_votes.csvPK!H=%)-voteview_dev-0.1.2.dist-info/entry_points.txtPK!$voteview_dev-0.1.2.dist-info/LICENSEPK!HڽTU"ǜvoteview_dev-0.1.2.dist-info/WHEELPK!H5NS %[voteview_dev-0.1.2.dist-info/METADATAPK!H)-h#Ovoteview_dev-0.1.2.dist-info/RECORDPK9