class RedditApi::Users

Constants

DEFAULT_MAX_MISSES

Attributes

last_count[RW]
max_misses[R]
misses[RW]
post_api[R]
user_factory[R]

Public Class Methods

new(args = {}) click to toggle source
# File lib/reddit_api/users.rb, line 8
def initialize(args = {})
  @post_api = args.fetch(:posts, RedditApi::Posts.new)
  @user_factory = RedditApi::User
  @misses = args.fetch(:misses, 0)
  @max_misses = args.fetch(:max_miss, DEFAULT_MAX_MISSES)
  @last_count = 0
end

Public Instance Methods

top_posters(subreddit, count) click to toggle source
# File lib/reddit_api/users.rb, line 16
def top_posters(subreddit, count)
  users = {}
  while users.length < count && misses < max_misses
    posts = post_api.top(subreddit, count)
    collect_users(posts, count, users)
    update_misses(users.length)
  end
  reset_collection_metrics
  users.values
end

Private Instance Methods

aggregate_users(new_users, collected_users) click to toggle source
# File lib/reddit_api/users.rb, line 64
def aggregate_users(new_users, collected_users)
  self.last_count = collected_users.length
  new_users.each do |user|
    collected_users[user.username] = user
  end
end
build_all_users(users_data) click to toggle source
# File lib/reddit_api/users.rb, line 54
def build_all_users(users_data)
  users_data.map! do |user_data|
    build_user(user_data)
  end
end
build_user(user_data) click to toggle source
# File lib/reddit_api/users.rb, line 60
def build_user(user_data)
  user_factory.new(user_data)
end
collect_users(posts, count, users) click to toggle source
# File lib/reddit_api/users.rb, line 32
def collect_users(posts, count, users)
  usernames = get_usernames(posts, count, users)
  user_data = format_user_data(usernames)
  new_users = build_all_users(user_data)
  aggregate_users(new_users, users)
end
format_user_data(usernames) click to toggle source
# File lib/reddit_api/users.rb, line 48
def format_user_data(usernames)
  usernames.map! do |username|
    { "username" => username }
  end
end
get_usernames(posts, count, users) click to toggle source
# File lib/reddit_api/users.rb, line 39
def get_usernames(posts, count, users)
  usernames = []
  posts.each_with_index do |post, i|
    break if (users.length + i) == count
    usernames << post.author
  end
  usernames
end
reset_collection_metrics() click to toggle source
# File lib/reddit_api/users.rb, line 77
def reset_collection_metrics
  self.misses = 0
  self.last_count = 0
end
update_misses(new_count) click to toggle source
# File lib/reddit_api/users.rb, line 71
def update_misses(new_count)
  if (new_count - last_count).zero?
    self.misses += 1
  end
end