Skip to content

Commit

Permalink
added backwards compatibility for events in v3 and v5 APi. #287
Browse files Browse the repository at this point in the history
  • Loading branch information
Martin Fenner committed May 9, 2015
1 parent 314ef30 commit 67e7b34
Show file tree
Hide file tree
Showing 30 changed files with 461 additions and 42 deletions.
9 changes: 5 additions & 4 deletions app/models/retrieval_status.rb
Expand Up @@ -197,10 +197,6 @@ def to_param
"#{source.name}:#{work.pid}"
end

def events
[]
end

# dates via utc time are more accurate than Date.today
def today
Time.zone.now.to_date
Expand Down Expand Up @@ -346,6 +342,11 @@ def timestamp
alias_method :display_name, :title
alias_method :update_date, :timestamp

# for backwards compatibility in v3 and v5 APIs
def events
extra
end

def cache_key
"event/#{id}-#{timestamp}"
end
Expand Down
8 changes: 8 additions & 0 deletions app/models/sources/article_coverage.rb
@@ -1,4 +1,12 @@
class ArticleCoverage < Source
# include common methods for Article Coverage
include Coverable

def get_extra(result)
Array(result['referrals']).map do |item|
{ event: item,
event_time: get_iso8601_from_time(item['published_on']),
event_url: item['referral'] }
end
end
end
23 changes: 23 additions & 0 deletions app/models/sources/article_coverage_curated.rb
@@ -1,4 +1,27 @@
class ArticleCoverageCurated < Source
# include common methods for Article Coverage
include Coverable

def get_extra(result)
Array(result.fetch('referrals', nil)).map do |item|
event_time = get_iso8601_from_time(item['published_on'])
url = item['referral']
type = item.fetch("type", nil)
type = MEDIACURATION_TYPE_TRANSLATIONS.fetch(type, nil) if type

{ event: item,
event_time: event_time,
event_url: url,

# the rest is CSL (citation style language)
event_csl: {
'author' => '',
'title' => item.fetch('title') { '' },
'container-title' => item.fetch('publication') { '' },
'issued' => get_date_parts(event_time),
'url' => url,
'type' => type }
}
end
end
end
27 changes: 27 additions & 0 deletions app/models/sources/bmc_fulltext.rb
Expand Up @@ -17,6 +17,7 @@ def parse_data(result, work, options={})
return result if result[:error] || result["entries"].nil?

related_works = get_related_works(result, work)
extra = get_extra(result)
events_url = related_works.length > 0 ? get_events_url(work) : nil

{ works: related_works,
Expand All @@ -25,6 +26,7 @@ def parse_data(result, work, options={})
work: work.pid,
total: related_works.length,
events_url: events_url,
extra: extra,
days: get_events_by_day(related_works, work),
months: get_events_by_month(related_works) } }
end
Expand Down Expand Up @@ -52,6 +54,31 @@ def get_related_works(result, work)
end
end

def get_extra(result)
result.fetch("entries", []).map do |item|
event_time = get_iso8601_from_time(item.fetch("published Date", nil))
# workaround since the "doi" attribute is sometimes empty
doi = "10.1186/#{item.fetch("arxId")}"
author = Nokogiri::HTML::fragment(item.fetch("authorNames", ""))
title = Nokogiri::HTML::fragment(item.fetch("bibliograhyTitle", ""))
container_title = Nokogiri::HTML::fragment(item.fetch("longCitation", ""))

{ event: item,
event_time: event_time,
event_url: "http://dx.doi.org/#{doi}",

# the rest is CSL (citation style language)
event_csl: {
"author" => get_authors(author.at_css("span").text.strip.split(/(?:,|and)/), reversed: true),
"title" => title.at_css("p").text,
"container-title" => container_title.at_css("em").text,
"issued" => get_date_parts(event_time),
"url" => "http://dx.doi.org/#{doi}",
"type" => "article-journal" }
}
end
end

def config_fields
[:url, :events_url]
end
Expand Down
11 changes: 11 additions & 0 deletions app/models/sources/citeulike.rb
Expand Up @@ -44,6 +44,17 @@ def get_related_works(result, work)
end
end

def get_extra(result)
extra = result['posts'] && result['posts']['post'].respond_to?("map") && result['posts']['post']
extra = [extra] if extra.is_a?(Hash)
extra ||= nil
Array(extra).map do |item|
{ event: item,
event_time: get_iso8601_from_time(item["post_time"]),
event_url: item['link']['url'] }
end
end

def config_fields
[:url, :events_url]
end
Expand Down
38 changes: 33 additions & 5 deletions app/models/sources/cross_ref.rb
Expand Up @@ -34,7 +34,8 @@ def parse_data(result, work, options={})
events: {
source: name,
work: work.pid,
total: total } }
total: total,
extra: get_extra(result) } }
end

def get_related_works(result, work)
Expand Down Expand Up @@ -69,6 +70,37 @@ def get_related_works(result, work)
end.compact
end

def get_extra(result)
extra = result.deep_fetch('crossref_result', 'query_result', 'body', 'forward_link') { nil }
if extra.is_a?(Hash) && extra['journal_cite']
extra = [extra]
elsif extra.is_a?(Hash)
extra = nil
end

Array(extra).map do |item|
item = item.fetch('journal_cite') { {} }
if item.empty?
nil
else
url = get_url_from_doi(item.fetch('doi', nil))

{ event: item,
event_url: url,

# the rest is CSL (citation style language)
event_csl: {
'author' => get_authors(item.fetch('contributors', {}).fetch('contributor', [])),
'title' => String(item.fetch('article_title') { '' }).titleize,
'container-title' => item.fetch('journal_title') { '' },
'issued' => get_date_parts_from_parts(item['year']),
'url' => url,
'type' => 'article-journal' }
}
end
end.compact
end

def get_authors(contributors)
contributors = [contributors] if contributors.is_a?(Hash)
contributors.map do |contributor|
Expand All @@ -93,10 +125,6 @@ def timeout
config.timeout || 120
end

def workers
config.workers || 10
end

def by_publisher?
true
end
Expand Down
5 changes: 5 additions & 0 deletions app/models/sources/datacite.rb
Expand Up @@ -27,6 +27,11 @@ def get_related_works(result, work)
end.compact
end

def get_extra(result)
result["response"] ||= {}
Array(result["response"]["docs"]).map { |item| { event: item, event_url: "http://doi.org/#{item['doi']}" } }
end

def url
"http://search.datacite.org/api?q=relatedIdentifier:%{doi}&fl=doi,creator,title,publisher,publicationYear,resourceTypeGeneral,datacentre,datacentre_symbol,prefix,relatedIdentifier&fq=is_active:true&fq=has_metadata:true&rows=1000&wt=json"
end
Expand Down
5 changes: 2 additions & 3 deletions app/models/sources/europe_pmc_data.rb
Expand Up @@ -17,7 +17,6 @@ def parse_data(result, work, options={})

total = result.fetch("hitCount", nil).to_i
related_works = get_related_works(result, work)
extra = get_extra(result, work)
events_url = total > 0 ? get_events_url(work) : nil

{ works: related_works,
Expand All @@ -26,7 +25,7 @@ def parse_data(result, work, options={})
work: work.pid,
total: total,
events_url: events_url,
extra: extra } }
extra: get_extra(result) } }
end

def get_related_works(result, work)
Expand All @@ -48,7 +47,7 @@ def get_related_works(result, work)
end
end

def get_extra(result, work)
def get_extra(result)
result = result.deep_fetch('dbCountList', 'db') { [] }
result.reduce({}) { |hash, db| hash.update(db["dbName"] => db["count"]) }
end
Expand Down
21 changes: 21 additions & 0 deletions app/models/sources/plos_comments.rb
Expand Up @@ -20,6 +20,7 @@ def parse_data(result, work, options={})
discussed: total,
total: total,
events_url: events_url,
extra: get_extra(result, work),
days: get_events_by_day(related_works, work),
months: get_events_by_month(related_works) } }
end
Expand All @@ -41,6 +42,26 @@ def get_related_works(result, work)
end
end

def get_extra(result, work)
Array(result['data']).map do |item|
event_time = get_iso8601_from_time(item['created'])

{ event: item,
event_time: event_time,
event_url: nil,

# the rest is CSL (citation style language)
event_csl: {
'author' => get_authors([item.fetch('creatorFormattedName', "")]),
'title' => item.fetch('title', ""),
'container-title' => 'PLOS Comments',
'issued' => get_date_parts(event_time),
'url' => work.doi_as_url,
'type' => 'personal_communication' }
}
end
end

def config_fields
[:url_private]
end
Expand Down
22 changes: 22 additions & 0 deletions app/models/sources/plos_fulltext.rb
Expand Up @@ -26,6 +26,7 @@ def parse_data(result, work, options={})
work: work.pid,
total: total,
events_url: events_url,
extra: get_extra(result),
days: get_events_by_day(related_works, work),
months: get_events_by_month(related_works) } }
end
Expand All @@ -49,6 +50,27 @@ def get_related_works(result, work)
end
end

def get_extra(result)
result.fetch("response", {}).fetch("docs", []).map do |item|
event_time = get_iso8601_from_time(item.fetch("publication_date", nil))
doi = item.fetch("id")

{ event: item,
event_time: event_time,
event_url: "http://dx.doi.org/#{doi}",

# the rest is CSL (citation style language)
event_csl: {
"author" => get_authors(item.fetch("author_display", [])),
"title" => item.fetch("title", ""),
"container-title" => item.fetch("cross_published_journal_name", []).first,
"issued" => get_date_parts(event_time),
"url" => "http://dx.doi.org/#{doi}",
"type" => "article-journal" }
}
end
end

def config_fields
[:url, :events_url]
end
Expand Down
9 changes: 9 additions & 0 deletions app/models/sources/pub_med.rb
Expand Up @@ -45,6 +45,15 @@ def get_related_works(result, work)
end
end

def get_extra(result)
extra = result.deep_fetch('PubMedToPMCcitingformSET', 'REFORM', 'PMCID') { nil }
extra = [extra] if extra.is_a?(Hash)
Array(extra).map do |item|
{ :event => item,
:event_url => "http://www.pubmedcentral.nih.gov/articlerender.fcgi?artid=" + item }
end
end

def get_events_url(work)
if work.pmid.present?
events_url % { :pmid => work.pmid }
Expand Down
24 changes: 24 additions & 0 deletions app/models/sources/reddit.rb
Expand Up @@ -8,6 +8,7 @@ def parse_data(result, work, options={})
comments = get_sum(result, 'data', 'num_comments')
total = likes + comments
related_works = get_related_works(result, work)
extra = get_extra(result)
events_url = total > 0 ? get_events_url(work) : nil

{ works: related_works,
Expand All @@ -18,6 +19,7 @@ def parse_data(result, work, options={})
likes: likes,
total: total,
events_url: events_url,
extra: extra,
days: get_events_by_day(related_works, work),
months: get_events_by_month(related_works) } }
end
Expand All @@ -41,6 +43,28 @@ def get_related_works(result, work)
end
end

def get_extra(result)
result.map do |item|
data = item['data']
event_time = get_iso8601_from_epoch(data['created_utc'])
url = data['url']

{ event: data,
event_time: event_time,
event_url: url,

# the rest is CSL (citation style language)
event_csl: {
'author' => get_authors([data.fetch('author', "")]),
'title' => data.fetch('title', ""),
'container-title' => 'Reddit',
'issued' => get_date_parts(event_time),
'url' => url,
'type' => 'personal_communication' }
}
end
end

def config_fields
[:url, :events_url]
end
Expand Down
24 changes: 24 additions & 0 deletions app/models/sources/researchblogging.rb
Expand Up @@ -28,6 +28,30 @@ def get_related_works(result, work)
end
end

def get_extra(result)
extra = result.deep_fetch('blogposts', 'post') { nil }
extra = [extra] if extra.is_a?(Hash)
Array(extra).map do |item|
event_time = get_iso8601_from_time(item["published_date"])
url = item['post_URL']

{ event: item,
event_time: event_time,
event_url: url,

# the rest is CSL (citation style language)
event_csl: {
'author' => get_authors([item.fetch('blogger_name', "")]),
'title' => item.fetch('post_title', ""),
'container-title' => item.fetch('blog_name', ""),
'issued' => get_date_parts(event_time),
'url' => url,
'type' => 'post'
}
}
end
end

def config_fields
[:url, :events_url, :username, :password]
end
Expand Down

0 comments on commit 67e7b34

Please sign in to comment.