예제 #1
0
    def test_do_steady_tweets(self, mocker: MockerFixture, gp_bot: GomiPeopleBot):
        # 静的ツイートに該当しない時間の場合
        assert gp_bot.do_steady_tweets(datetime(2020, 1, 1, 0, 8, 0)) == False

        # 静的ツイートに該当する時間の場合(サンプルで定時報告のみ)
        mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet)
        assert gp_bot.do_steady_tweets(datetime(2020, 1, 1, 3, 30, 0)) == True
예제 #2
0
    def test_get_latest_status_id(self, mocker: MockerFixture, gp_bot: GomiPeopleBot):
        # 自身のツイートが存在しない場合
        mocker.patch.object(TwitterAPI, "GetUserTimeline", return_value=[])
        assert gp_bot.get_latest_status_id() is None

        # 自身のツイートが存在するが、リプライツイートがない場合
        mocker.patch.object(TwitterAPI, "GetUserTimeline", return_value=SELF_TWEETS[:2])
        assert gp_bot.get_latest_status_id() == "9999_1"

        # 自身のツイートが存在し、リプライツイートがある場合
        mocker.patch.object(TwitterAPI, "GetUserTimeline", return_value=SELF_TWEETS)
        assert gp_bot.get_latest_status_id() == "9999_3"
예제 #3
0
def gp_bot():
    from gp_bot.bot import GomiPeopleBot

    # 単体テスト時に誤って投稿されない(エラーを起こす)ためにあえて _HOGE を付加
    consumer_key = os.environ.get("TWITTER_CONSUMER_KEY") + "_HOGE"
    consumer_secret = os.environ.get("TWITTER_CONSUMER_SECRET") + "_HOGE"
    access_token_key = os.environ.get("TWITTER_ACCESS_TOKEN_KEY") + "_HOGE"
    access_token_secret = os.environ.get(
        "TWITTER_ACCESS_TOKEN_SECRET") + "_HOGE"

    return GomiPeopleBot(consumer_key, consumer_secret, access_token_key,
                         access_token_secret,
                         "/workspaces/gp_bot/result/model.pth")
예제 #4
0
    def test_do_mentions(self, mocker: MockerFixture, gp_bot: GomiPeopleBot):
        # 指定した分間隔でない場合
        assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 8, 0), "TEST_MENTION_ID") == False

        # メンションが1件もない場合
        mocker.patch.object(TwitterAPI, "GetMentions", return_value=[])
        assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), "TEST_MENTION_ID") == False

        # last_mention_idがNoneかつメンションがある場合
        mocker.patch.object(TwitterAPI, "GetMentions", return_value=MENTIONED_TWEETS)
        assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), None) == False

        # 返信を行う場合で受けたメンションがMAX_N_MENTIONSで指定された件数以下の場合
        mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet)
        mocker.patch.object(TwitterAPI, "GetMentions", return_value=MENTIONED_TWEETS[:4])
        assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), "TEST_MENTION_ID") == True

        # 返信を行う場合で受けたメンションがMAX_N_MENTIONSで指定された件数より多い場合
        posted_mock = mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet)
        mocker.patch.object(TwitterAPI, "GetMentions", return_value=MENTIONED_TWEETS)
        assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), "TEST_MENTION_ID") == True
        # メンション先はランダムで決まるため、PostUpdateのモック関数が呼ばれた回数で判断
        assert posted_mock.call_count == MAX_N_MENTIONS
예제 #5
0
    def test_post(self, mocker: MockerFixture, gp_bot: GomiPeopleBot):
        mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet)

        # メンションIDありの場合
        assert gp_bot.post("test", "0001_1") == "9999_1"

        # メンションIDなし(None)の場合
        assert gp_bot.post("test") == "9999_0"

        # テキストがNoneの場合
        with pytest.raises(ValueError):
            gp_bot.post(None)

        # テキストが空文字の場合
        with pytest.raises(ValueError):
            gp_bot.post("")
예제 #6
0
 def test_generate_text(self, gp_bot: GomiPeopleBot):
     text = gp_bot.generate_text(20)
     assert isinstance(text, str)
     assert len(text) <= 20
예제 #7
0
    def test_load_steady_tweets(self, gp_bot: GomiPeopleBot):
        tweets = gp_bot.load_steady_tweets("/workspaces/gp_bot/steady_tweets.yml")

        # 1件だけ確認する
        assert {"type": "%H:%M", "dt": "03:30", "text": "サンジハン!!"} in tweets
예제 #8
0
파일: train.py 프로젝트: NavirePlus/gp_bot
    def __init__(self,
                 batch_size: int,
                 bptt: int,
                 clip: float,
                 corpus: Corpus,
                 dropout: float,
                 emb_size: int,
                 epochs: int,
                 lr: int,
                 n_hidden: int,
                 n_layers: int,
                 cuda: bool = False,
                 logger: Optional[Logger] = None) -> None:
        """コンストラクタ.

        Parameters
        ----------
        batch_size : int
            バッチサイズ
        bptt : int
            Back-Propagation Through Time(シーケンスサイズ)
        clip : float
            勾配のNormのClipping閾値
        corpus : :obj:`Corpus`
            コーパス情報
        dropout : float
            Dropout率
        emb_size : int
            入力ベクトルの次元数
        epochs : int
            Epoch数
        lr : int
            学習率
        n_hidden : int
            LSTMの隠れユニットの次元数
        n_layers : int
            Reccurentレイヤー数
        cuda : bool, optional
            GPUを利用するか否かのフラグ(デフォルト:利用しない)
        logging : logging.Logger, optional
            ロガー

        """
        self.criterion = nn.CrossEntropyLoss()

        self.batch_size = batch_size
        self.bptt = bptt
        self.clip = clip
        self.corpus = corpus
        self.emb_size = emb_size
        self.epochs = epochs
        self.dropout = dropout
        self.lr = lr
        self.n_hidden = n_hidden
        self.n_layers = n_layers
        self.n_vocab = len(corpus.dictionary)

        self.all_total_loss: List[float] = []
        self.device = torch.device("cuda" if cuda else "cpu")
        self.model = GPLangModel(self.n_vocab, self.emb_size, self.n_hidden,
                                 self.n_layers, self.dropout).to(self.device)
        self.corpus.train_data = self.batchfy(self.corpus.train_data)
        self.logger = logger if logger else GomiPeopleBot.create_logger()