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