ソースを参照

Add skeleton to handle users in db

Not yet functional, but the new directory organization in sqlalchemy will
be handy
theenglishway (time) 7 年 前
コミット
f17af02ab0

+ 13 - 2
twhatter/cli.py

@@ -6,7 +6,7 @@ import click
 import IPython
 
 from twhatter.client import ClientTimeline, ClientProfile
-from twhatter.output import Database, Tweet
+from twhatter.output.sqlalchemy import Database, Tweet, User
 
 
 @click.group()
@@ -58,6 +58,16 @@ def timeline(ctx, limit, user):
     ctx.obj['db'].add_all(*tweets)
 
 
+@db.command()
+@click.argument('user')
+@click.pass_context
+def profile(ctx, user):
+    """Push some user into a database"""
+    p = ClientProfile(user)
+
+    ctx.obj['db'].add_all(User.from_raw(p.user))
+
+
 @db.command()
 @click.pass_context
 def shell(ctx):
@@ -65,7 +75,8 @@ def shell(ctx):
     user_ns = {
         'db': ctx.obj['db'],
         'session': session,
-        'Tweet': Tweet
+        'Tweet': Tweet,
+        'User': User
     }
     IPython.start_ipython(argv=[], user_ns=user_ns)
     ctx.obj['db'].stop(session)

+ 0 - 1
twhatter/output/__init__.py

@@ -1,2 +1 @@
-from .sqlalchemy import *
 from .print import Print

+ 3 - 2
twhatter/output/sqlalchemy/__init__.py

@@ -1,8 +1,9 @@
 from .db import Database
-from .models import Tweet
+from .models import *
 
 
 __all__ = [
     'Database',
-    'Tweet'
+    'Tweet',
+    'User'
 ]

+ 2 - 0
twhatter/output/sqlalchemy/models/__init__.py

@@ -0,0 +1,2 @@
+from .tweets import Tweet
+from .user import User

+ 5 - 2
twhatter/output/sqlalchemy/models.py

@@ -1,7 +1,8 @@
 from dataclasses import asdict
 
-from sqlalchemy import Column, Integer, String, DateTime
+from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
 from sqlalchemy.ext.hybrid import hybrid_property
+from sqlalchemy.orm import relationship
 
 from twhatter.output.sqlalchemy.db import Base
 
@@ -11,7 +12,7 @@ class Tweet(Base):
 
     id = Column(Integer, primary_key=True)
     screen_name = Column(String)
-    user_id = Column(Integer)
+    user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
     comments_nb = Column(Integer)
     retweets_nb = Column(Integer)
     likes_nb = Column(Integer)
@@ -21,6 +22,8 @@ class Tweet(Base):
     _hashtag_list = Column("hashtag_list", String)
     _mention_list = Column(String)
 
+    user = relationship('User', backref='tweets')
+
     @hybrid_property
     def hashtag_list(self):
         return self._hashtag_list.split(',')

+ 28 - 0
twhatter/output/sqlalchemy/models/user.py

@@ -0,0 +1,28 @@
+from dataclasses import asdict
+
+from sqlalchemy import Column, Integer, String, DateTime
+
+from twhatter.output.sqlalchemy.db import Base
+
+
+class User(Base):
+    __tablename__ = 'users'
+
+    id = Column(Integer, primary_key=True)
+    screen_name = Column(String)
+    join_date = Column(DateTime)
+    tweets_nb = Column(Integer)
+    following_nb = Column(Integer)
+    followers_nb = Column(Integer)
+    likes_nb = Column(Integer)
+
+    def __repr__(self):
+        return "<{0} (id={1.id})".format(self.__class__.__qualname__, self)
+
+    @classmethod
+    def from_raw(cls, raw_user):
+        kwargs = {
+            k: v
+            for k, v in asdict(raw_user).items()
+        }
+        return cls(**kwargs)