Pārlūkot izejas kodu

Change "screen_name" into "fullname" & "username"

theenglishway (time) 7 gadi atpakaļ
vecāks
revīzija
37ced8cd34

+ 1 - 1
README.rst

@@ -67,7 +67,7 @@ Display some user's tweets ::
 Display their profile information ::
 
     $ twhatter profile realDonaldTrump
-    User(id=25073877, screen_name='Donald J. Trump', join_date=datetime.datetime(2009, 3, 18, 0, 0), tweets_nb=40183, following_nb=45, followers_nb=57144827, likes_nb=7)
+    User(id=25073877, fullname='Donald J. Trump', join_date=datetime.datetime(2009, 3, 18, 0, 0), tweets_nb=40183, following_nb=45, followers_nb=57144827, likes_nb=7)
 
 Put them into a local database (by default in /tmp/db.sqlite) ::
 

+ 25 - 13
tests/conftest.py

@@ -46,7 +46,8 @@ class MediaInfo(NamedTuple):
 class TweetInfo(NamedTuple):
     """Class to hold information about a tweet that is already known"""
     id: int
-    screen_name: str
+    username: str
+    fullname: str
     user_id: int
     permalink: str
     timestamp: datetime = None
@@ -69,7 +70,8 @@ def tweet_collection():
     return {
         'plain': TweetInfo(
             id=1077838164813848576,
-            screen_name="the_english_way",
+            username="the_english_way",
+            fullname="theenglishway",
             user_id=943804775942033408,
             timestamp=datetime.utcfromtimestamp(1545811618),
             permalink="/the_english_way/status/1077838164813848576",
@@ -78,7 +80,8 @@ def tweet_collection():
         ),
         'reaction_tweet': TweetInfo(
             id=1078281840945963008,
-            screen_name="the_english_way",
+            username="the_english_way",
+            fullname="theenglishway",
             user_id=943804775942033408,
             timestamp=datetime.utcfromtimestamp(1545917399),
             permalink="/the_english_way/status/1078281840945963008",
@@ -87,7 +90,8 @@ def tweet_collection():
         ),
         'with_link': TweetInfo(
             id=1077505613079429120,
-            screen_name="the_english_way",
+            username="the_english_way",
+            fullname="theenglishway",
             user_id=943804775942033408,
             timestamp=datetime.utcfromtimestamp(1545732331),
             permalink="/the_english_way/status/1077505613079429120",
@@ -95,7 +99,8 @@ def tweet_collection():
         ),
         'retweet': TweetInfo(
             id=1055037291108974592,
-            screen_name="Senficon",
+            username="Senficon",
+            fullname="Julia Reda",
             user_id=14861745,
             retweeter="the_english_way",
             retweet_id=1055098556300828672,
@@ -104,7 +109,8 @@ def tweet_collection():
         ),
         'hashtags': TweetInfo(
             id=1039969574555471873,
-            screen_name="BurgerQuizOff",
+            username="BurgerQuizOff",
+            fullname="Burger Quiz",
             user_id=949604705772228608,
             retweeter="the_english_way",
             permalink="/BurgerQuizOff/status/1039969574555471873",
@@ -112,7 +118,8 @@ def tweet_collection():
         ),
         'mentions': TweetInfo(
             id=1077838164813848576,
-            screen_name="the_english_way",
+            username="the_english_way",
+            fullname="theenglishway",
             user_id=943804775942033408,
             timestamp=datetime.utcfromtimestamp(1545811618),
             permalink="/the_english_way/status/1077838164813848576",
@@ -120,7 +127,8 @@ def tweet_collection():
         ),
         'stats': TweetInfo(
             id=1039969574555471873,
-            screen_name="BurgerQuizOff",
+            username="BurgerQuizOff",
+            fullname="Burger Quiz",
             user_id=949604705772228608,
             permalink="/BurgerQuizOff/status/1039969574555471873",
             retweeter="the_english_way",
@@ -130,7 +138,8 @@ def tweet_collection():
         ),
         'media':TweetInfo(
             id=1086327536726900736,
-            screen_name="the_english_way",
+            username="the_english_way",
+            fullname="theenglishway",
             user_id=943804775942033408,
             permalink="/the_english_way/status/1086327536726900736",
             media=MediaInfo(
@@ -157,7 +166,7 @@ def raw_html_user_initial_page(raw_html_user_initial_page_factory, user):
 @pytest.fixture(scope="session")
 def raw_tweet_factory(raw_html_user_initial_page_factory):
     def _raw_tweet_factory(tweet_info):
-        user_page = tweet_info.retweeter or tweet_info.screen_name
+        user_page = tweet_info.retweeter or tweet_info.username
         soup = raw_html_user_initial_page_factory(user_page)
         return soup.find(id="stream-item-tweet-{}".format(tweet_info.id))
 
@@ -177,7 +186,8 @@ def tweet_test_data_factory(raw_tweet_factory, tweet_collection):
 class UserInfo(NamedTuple):
     """Class to hold information about an user that is already known"""
     id: int
-    screen_name: str
+    fullname: str
+    username: str
     join_date: datetime
     tweets_nb: int = None
     following_nb: int = None
@@ -190,7 +200,8 @@ def user_collection():
     return {
         'Marlene_beadles': UserInfo(
             id=295177446,
-            screen_name="Marlene Hansen",
+            username="Marlene_beadles",
+            fullname="Marlene Hansen",
             join_date=datetime(2011, 5, 8, 0, 0),
             tweets_nb=25,
             following_nb=342,
@@ -199,7 +210,8 @@ def user_collection():
         ),
         'the_english_way': UserInfo(
             id=943804775942033408,
-            screen_name="theenglishway",
+            fullname="theenglishway",
+            username="the_english_way",
             join_date=datetime(2017, 12, 21, 0, 0),
         ),
     }

+ 1 - 1
twhatter/output/sqlalchemy/db.py

@@ -55,7 +55,7 @@ class Database(OutputBase):
 
         profiles = set()
         for t in client_timeline:
-            p = ClientProfile(t.screen_name)
+            p = ClientProfile(t.username)
             profiles.add(p)
         users = [User.from_raw(p.user) for p in profiles]
 

+ 1 - 1
twhatter/output/sqlalchemy/models/tweets.py

@@ -11,7 +11,7 @@ class Tweet(Base):
     __tablename__ = 'tweets'
 
     id = Column(Integer, primary_key=True)
-    screen_name = Column(String)
+    username = Column(String)
     user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
     comments_nb = Column(Integer)
     retweets_nb = Column(Integer)

+ 1 - 1
twhatter/output/sqlalchemy/models/user.py

@@ -9,7 +9,7 @@ class User(Base):
     __tablename__ = 'users'
 
     id = Column(Integer, primary_key=True)
-    screen_name = Column(String)
+    fullname = Column(String)
     join_date = Column(DateTime)
     tweets_nb = Column(Integer)
     following_nb = Column(Integer)

+ 5 - 3
twhatter/parser/tweet.py

@@ -16,8 +16,10 @@ logger = logging.getLogger(__name__)
 class TweetBase(ExtractableMixin):
     #: Tweet ID
     id: int
-    #: Handle of the tweet's original author
-    screen_name: str
+    #: Tweeter handle of the tweet's author (the handle used for URLs)
+    username: str
+    #: Name of the tweet's author (the name as it appears on-screen)
+    fullname: str
     #: ID of the tweet's original author
     user_id: int
     #: Number of comments
@@ -77,7 +79,7 @@ class TweetBase(ExtractableMixin):
         return int(soup['data-item-id'])
 
     @classmethod
-    def extract_screen_name(cls, soup):
+    def extract_username(cls, soup):
         return cls._extract_from_div_tweet(soup, 'screen-name')
 
     @classmethod

+ 15 - 2
twhatter/parser/user.py

@@ -12,12 +12,21 @@ logger = logging.getLogger(__name__)
 
 @dataclass
 class User(ExtractableMixin):
+    #: User ID
     id: int
-    screen_name: str
+    #: Tweeter handle (the one used for URLs)
+    username: str
+    # Name as it appears on screen
+    fullname: str
+    # Date at which the user joined
     join_date: datetime
+    # Total number of tweets
     tweets_nb: int
+    # Total number of accounts followed
     following_nb: int
+    # Total number of followers
     followers_nb: int
+    # Total number of likes sent by this user
     likes_nb: int
 
     #: The soup extracted from the raw HTML
@@ -37,9 +46,13 @@ class User(ExtractableMixin):
         return int(cls._extract_from_div(soup, 'ProfileNav', 'user-id'))
 
     @classmethod
-    def extract_screen_name(cls, soup):
+    def extract_fullname(cls, soup):
         return soup.find('a', 'ProfileHeaderCard-nameLink').text
 
+    @classmethod
+    def extract_username(cls, soup):
+        return soup.find('b', 'u-linkComplex-target').text
+
     @classmethod
     def extract_join_date(cls, soup):
         kw = 'title'