class MingleEvents::ProjectEventFetcher

fetch all unseen events and write them to disk for future processing

this class is messy and needs some cleanup, but some things are in here for a reason. specifically, for historical analysis, we can process each event, one at at time, reading it off disk, to avoid massive memory consumption.

Attributes

entry_cache[R]

Public Class Methods

new(project_identifier, mingle_access, state_dir=nil) click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
12 def initialize(project_identifier, mingle_access, state_dir=nil)
13   @project_identifier = project_identifier
14   @mingle_access = mingle_access
15   base_uri = URI.parse(mingle_access.base_url)
16   @state_dir = state_dir || File.join('~', '.mingle_events', base_uri.host, base_uri.port.to_s)
17   @state_dir = File.expand_path(File.join(@state_dir, project_identifier, 'fetched_events'))
18   @entry_cache = EntryCache.new(@state_dir)
19 end

Public Instance Methods

all_fetched_entries() click to toggle source

returns all previously fetched entries; can be used to reprocess the events for, say, various historical analyses

   # File lib/mingle_events/project_event_fetcher.rb
76 def all_fetched_entries
77   @entry_cache.all_entries
78 end
clear_cache_if_first_entry_mismatch!() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
57 def clear_cache_if_first_entry_mismatch!
58   unless first_entry_cached_match?
59     reset
60   end
61 end
fetch_latest() click to toggle source

fetch the latest events from mingle, i.e., the ones not previously seen

   # File lib/mingle_events/project_event_fetcher.rb
33 def fetch_latest
34   page = page_with_latest_entries
35   most_recent_new_entry = page.entries.first
36   last_fetched_entry = @entry_cache.latest
37   last_fetched_entry_seen = false      
38   next_entry = nil
39   while !last_fetched_entry_seen && page
40     page.entries.each do |entry|
41                 
42       @entry_cache.write(entry, next_entry)
43       if last_fetched_entry && entry.entry_id == last_fetched_entry.entry_id
44         last_fetched_entry_seen = true
45         break
46       end
47 
48       next_entry = entry
49     end
50     page = page.next
51   end
52               
53   @entry_cache.update_current_state(next_entry, most_recent_new_entry)
54   @entry_cache.entries(next_entry, most_recent_new_entry)
55 end
first_entry_cached_match?() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
63 def first_entry_cached_match?
64   if first_entry_cached = first_entry_fetched
65     page = page_with_first_entries
66     if first_entry = page.entries.last
67       first_entry_fetched.entry_id == first_entry.entry_id
68     end
69   else
70     true
71   end
72 end
first_entry_fetched() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
80 def first_entry_fetched      
81   @entry_cache.first
82 end
last_entry_fetched() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
84 def last_entry_fetched
85   @entry_cache.latest
86 end
reset() click to toggle source

blow away any existing state, when next used to fetch events from mingle will crawl all the way back to time zero

   # File lib/mingle_events/project_event_fetcher.rb
23 def reset
24   @entry_cache.clear
25 end
set_current_state_to_now_if_no_current_state() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
27 def set_current_state_to_now_if_no_current_state
28   return if @entry_cache.has_current_state?
29   @entry_cache.set_current_state(page_with_latest_entries.entries.first)
30 end

Private Instance Methods

page_with_first_entries() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
94 def page_with_first_entries
95   Feed::Page.new("/api/v2/projects/#{@project_identifier}/feeds/events.xml?page=1", @mingle_access)
96 end
page_with_latest_entries() click to toggle source
   # File lib/mingle_events/project_event_fetcher.rb
90 def page_with_latest_entries
91   Feed::Page.new("/api/v2/projects/#{@project_identifier}/feeds/events.xml", @mingle_access)
92 end