Project

General

Profile

機能 #795 » 795-ancestors-fix.patch

Osamu Koga, 2015-11-23 21:08

View differences:

core/message.rb
340 340
  def quoted_by?
341 341
    !quoted_by.empty? end
342 342

  
343
  # 投稿の宛先になっている投稿を再帰的にさかのぼるような _Enumerator_ を返す。
344
  # ==== Return
345
  # Enumerator
346
  def ancestors_enumerator(force_retrieve=false)
347
    Enumerator.new do |yielder|
348
      message = self
349
      while message
350
        yielder << message
351
        message = message.receive_message(force_retrieve) end end end
352
  private :ancestors_enumerator
353

  
343 354
  # 投稿の宛先になっている投稿を再帰的にさかのぼり、それぞれを引数に取って
344 355
  # ブロックが呼ばれる。
356
  # ブロックが渡されていない場合、 _Enumerator_ を返す。
345 357
  # _force_retrieve_ は、 Message#receive_message の引数にそのまま渡される
358
  # ==== Return
359
  # obj|Enumerator
346 360
  def each_ancestors(force_retrieve=false, &proc)
347
    proc.call(self)
348
    parent = receive_message(force_retrieve)
349
    parent.each_ancestors(force_retrieve, &proc) if parent
350
  end
361
    e = ancestors_enumerator(force_retrieve)
362
    if block_given?
363
      e.each(&proc)
364
    else
365
      e end end
351 366

  
352 367
  # 投稿の宛先になっている投稿を再帰的にさかのぼり、それらを配列にして返す。
353 368
  # 配列インデックスが大きいものほど、早く投稿された投稿になる。
354 369
  # ([0]は[1]へのリプライ)
355 370
  def ancestors(force_retrieve=false)
356
    Enumerator.new do |yielder|
357
      message = self
358
      while message
359
        yielder << message
360
        message = message.receive_message(force_retrieve) end end end
371
    ancestors_enumerator(force_retrieve).to_a end
361 372

  
362 373
  # 投稿の宛先になっている投稿を再帰的にさかのぼり、何にも宛てられていない投稿を返す。
363 374
  # つまり、一番祖先を返す。
364 375
  def ancestor(force_retrieve=false)
365
    ancestors(force_retrieve).to_a.last end
376
    ancestors(force_retrieve).last end
366 377

  
367
  # retweet元を再帰的に遡り、それらを配列にして返す。
368
  # 配列の最初の要素は必ずselfになり、以降は直前の要素のリツイート元となる。
369
  # ([0]は[1]へのリツイート)
378
  # retweet元を再帰的にさかのぼるような _Enumerator_ を返す。
379
  # この _Enumerator_ は最初にこの _Message_ 自身を yield し、以降は直前に yield した
380
  # 要素のretweet元を yield する。
370 381
  # ==== Return
371 382
  # Enumerator
372
  def retweet_ancestors(force_retrieve=false)
383
  def retweet_ancestors_enumerator(force_retrieve=false)
373 384
    Enumerator.new do |yielder|
374 385
      message = self
375 386
      while message
376 387
        yielder << message
377 388
        message = message.retweet_parent(force_retrieve)
378 389
      end end end
390
  private :retweet_ancestors_enumerator
391

  
392
  # retweet元を再帰的にさかのぼり、それぞれを引数に取って
393
  # ブロックが呼ばれる。
394
  # ブロックが渡されていない場合、 _Enumerator_ を返す。
395
  # _force_retrieve_ は、 Message#retweet_parent の引数にそのまま渡される
396
  # ==== Return
397
  # obj|Enumerator
398
  def each_retweet_ancestors(force_retrieve=false, &proc)
399
    e = retweet_ancestors_enumerator(force_retrieve)
400
    if block_given?
401
      e.each(&proc)
402
    else
403
      e end end
404

  
405
  # retweet元を再帰的に遡り、それらを配列にして返す。
406
  # 配列の最初の要素は必ずselfになり、以降は直前の要素のリツイート元となる。
407
  # ([0]は[1]へのリツイート)
408
  # ==== Return
409
  # Enumerator
410
  def retweet_ancestors(force_retrieve=false)
411
    retweet_ancestors_enumerator(force_retrieve).to_a end
379 412

  
380 413
  # リツイート元を再帰的に遡り、リツイートではないツイートを返す。
381 414
  # selfがリツイートでない場合は、selfを返す。
......
384 417
  # ==== Return
385 418
  # Message
386 419
  def retweet_ancestor(force_retrieve=false)
387
    retweet_ancestors(force_retrieve).to_a.last end
420
    retweet_ancestors(force_retrieve).last end
388 421

  
389 422
  # このMessageがリツイートなら、何のリツイートであるかを返す。
390 423
  # 返される値の retweet? は常に false になる
    (1-1/1)