diff --git a/README.md b/README.md index 0b41c1e..6a9638d 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ Contribution data for akerl: # ``` +### Polling for streaks longer than 1 year + ## Installation gem install githubstats diff --git a/lib/githubstats.rb b/lib/githubstats.rb index a6e353f..8e5ad63 100644 --- a/lib/githubstats.rb +++ b/lib/githubstats.rb @@ -1,5 +1,6 @@ require 'curb' require 'json' +require 'githubstats/longstreakpoller' ## # Rugged is used if available to look up the user's Github username @@ -29,6 +30,8 @@ def self.new(*args) ## # User object class User + include GithubStats::LongStreakPoller + attr_reader :name, :url, :data, :last_updated ## @@ -37,6 +40,7 @@ class User def initialize(params = {}) params = { name: params } unless params.is_a? Hash @name = params[:name] || guess_user + @poll_for_long_streaks = params[:poll_for_long_streaks] || false @url = (params[:url] || DEFAULT_URL) % @name @last_updated = nil end @@ -81,6 +85,7 @@ def guess_user(names = []) def load_data @data = GithubStats::Data.new download + poll_longer_streak if @data.streak.size == 366 && poll_for_long_streaks @last_updated = DateTime.now end diff --git a/lib/githubstats/longstreakpoller.rb b/lib/githubstats/longstreakpoller.rb new file mode 100644 index 0000000..2885594 --- /dev/null +++ b/lib/githubstats/longstreakpoller.rb @@ -0,0 +1,42 @@ +require 'open-uri' +begin + require 'nokogiri' + NOKOGIRI_AVAIL = true +rescue LoadError + NOKOGIRI_AVAIL = false +end + +## +# Performs polling to GitHub's user page to check for long streaks + +module GithubStats + module LongStreakPoller + def poll_longer_streak + return unless NOKOGIRI_AVAIL + page = open("https://github.com/#{@name}") + element = Nokogiri::HTML(page.read).css('.contrib-streak-current').first + streak = element.text.split[2].to_i + patch_streak(streak) if streak > @data.streak.size + end + + def patch_streak(new) + new_streak = StreakInjector.new + new_streak.override_streak new + @data.instance_variable_set(:@github_streak, new_streak) + @data.instance_eval "def streak\n@github_streak\nend" + @data.instance_eval "def longest_streak\n@github_streak\nend" + end + end + + class StreakInjector < Array + def override_streak(new) + @streak_length = new + end + + def size + @streak_length + end + + alias_method :length, :size + end +end