altmetric.rb 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (6) hide show
  1. data/README.md +61 -0
  2. data/Rakefile +32 -0
  3. data/bin/doi +9 -0
  4. data/lib/altmetric.rb +133 -0
  5. data/tests/ts_altmetric.rb +4 -0
  6. metadata +104 -0
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ Ruby Altmetric API Client
2
+ -------------------------
3
+
4
+ A simple Ruby client for the [Altmetric API][0].
5
+
6
+ Provides a basic client object for interacting with the API. Provides quick access to the JSON
7
+ results or direct access to API responses.
8
+
9
+ Installation
10
+ ------------
11
+
12
+ [sudo] gem install altmetric.rb
13
+
14
+ Relies on the `json`, `uri_template` and `httpclient` gems.
15
+
16
+ Basic Usage
17
+ -----------
18
+
19
+ require 'altmetric'
20
+
21
+ client = Altmetric::Client.new()
22
+ stats = client.doi("10.1038/news.2011.490")
23
+ #do something with the stats
24
+
25
+ Creating A Client
26
+ -----------------
27
+
28
+ The client can be created with an API key which is required to raise usage limits and also to access
29
+ the commercial parts of the API (the `fetch`) calls
30
+
31
+ opts = {
32
+ :apikey => "12345",
33
+ :user_agent => "MyCoolApp/1.0"
34
+ }
35
+
36
+ client = Altmetric::Client.new(opts)
37
+
38
+ Default `User-Agent` is currently `altmetric-ruby-client/0.0.1`
39
+
40
+ Read the Altmetric API documentation for notes on the structure of the responses and additional API parameters.
41
+
42
+ Rate Limiting
43
+ -------------
44
+
45
+ The client object will automatically inspect all responses and extract the HTTP headers that Altmetric
46
+ uses for [rate limiting][1].
47
+
48
+ The latest header values are automatically added as integers to the `Altmetric::Client::LIMITS` hash,
49
+ keyed on the header name. This simplifies monitoring limits over several requests, which may use different
50
+ clients.
51
+
52
+ License
53
+ -------
54
+
55
+ This work is hereby released into the Public Domain.
56
+
57
+ To view a copy of the public domain dedication, visit http://creativecommons.org/licenses/publicdomain or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
58
+
59
+
60
+ [0]. http://api.altmetric.com/
61
+ [1]. http://api.altmetric.com/index.html#rate_limiting
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'rake'
2
+ require 'rdoc/task'
3
+ require 'rake/testtask'
4
+ require 'rake/clean'
5
+
6
+ CLEAN.include ['*.gem', 'pkg']
7
+
8
+ $spec = eval(File.read('altmetric.spec'))
9
+
10
+ Rake::RDocTask.new do |rdoc|
11
+ rdoc.rdoc_dir = 'doc/rdoc'
12
+ rdoc.options += RDOC_OPTS
13
+ rdoc.rdoc_files.include("README.md", "lib/**/*.rb")
14
+ rdoc.main = "README.md"
15
+ end
16
+
17
+ Rake::TestTask.new do |test|
18
+ test.test_files = FileList['tests/tc_*.rb']
19
+ end
20
+
21
+ task :package do
22
+ sh %{gem build altmetric.spec}
23
+ end
24
+
25
+ task :install do
26
+ sh %{sudo gem install --no-ri --no-rdoc #{$spec.name}-#{$spec.version}.gem}
27
+ end
28
+
29
+ desc "Uninstall the gem"
30
+ task :uninstall => [:clean] do
31
+ sh %{sudo gem uninstall #{$spec.name}}
32
+ end
data/bin/doi ADDED
@@ -0,0 +1,9 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'altmetric'
3
+
4
+ client = Altmetric::Client.new()
5
+ puts client.doi("10.1038/news.2011.490")
6
+
7
+ client.doi("10.1038/news.2011.490") do |resp|
8
+ puts resp.status
9
+ end
data/lib/altmetric.rb ADDED
@@ -0,0 +1,133 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+ require 'httpclient'
4
+ require 'uri_template'
5
+
6
+ module Altmetric
7
+
8
+ class Client
9
+
10
+ DEFAULT_USER_AGENT = "altmetric-ruby-client/0.0.1"
11
+ URI_TEMPLATE = URITemplate.new("http://{host}/{version}{/path*}")
12
+
13
+ HOST = "api.altmetric.com"
14
+ VERSION = "v1"
15
+ KEY_PARAM="key"
16
+
17
+ HOURLY_RATE_LIMIT="X-HourlyRateLimit-Limit"
18
+ DAILY_RATE_LIMIT="X-DailyRateLimit-Limit"
19
+ HOURLY_RATE_LIMIT_REMAINING="X-HourlyRateLimit-Remaining"
20
+ DAILY_RATE_LIMIT_REMAINING="X-DailyRateLimit-Remaining"
21
+
22
+ RATE_HEADERS = [HOURLY_RATE_LIMIT, DAILY_RATE_LIMIT, HOURLY_RATE_LIMIT_REMAINING, DAILY_RATE_LIMIT_REMAINING]
23
+
24
+ LIMITS = {}
25
+
26
+ #Format a URL according to provided template
27
+ #
28
+ #Automatically injects the correct :host and :version params for
29
+ #the API
30
+ #
31
+ #template:: a valid URI template
32
+ #opts:: additional template params, should include :path
33
+ def self.make_url(template, opts)
34
+ return template.expand(
35
+ { :host => HOST,
36
+ :version => VERSION
37
+ }.merge(opts)
38
+ )
39
+ end
40
+
41
+ #Update class variable with latest rate limit data
42
+ #
43
+ #headers:: hash of response headers
44
+ def self.update_limits(headers)
45
+ RATE_HEADERS.each do |header|
46
+ LIMITS[header] = headers[header].to_i if headers[header]
47
+ end
48
+ end
49
+
50
+ #Create a new client object
51
+ #
52
+ #Supports several options in the provided hash, including:
53
+ #
54
+ #[apikey]:: specify altmetric API key, only required for +fetch+ method and increased rate limits
55
+ #[client]:: specify a pre-created HTTPClient object (e.g. for mocking during testing)
56
+ #[user_agent]]:: specify a user agent. Default is +DEFAULT_USER_AGENT+
57
+ #
58
+ #Method params:
59
+ #
60
+ #opts:: options for configuring client
61
+ def initialize(opts={})
62
+ name = opts[:user_agent] || DEFAULT_USER_AGENT
63
+ @client = opts[:client] || HTTPClient.new( :agent_name => name )
64
+ @apikey = opts[:apikey] || nil
65
+ @opts = opts
66
+ end
67
+
68
+ #Fetch altmetrics for a DOI
69
+ def doi(id, &block)
70
+ return get_metrics(["doi", id], &block)
71
+ end
72
+
73
+ #Fetch citations for a DOI
74
+ #
75
+ #Read the {API documentation}[http://api.altmetric.com/docs/call_citations.html] for explanation of parameters
76
+ def citations(timeframe, params, &block)
77
+ return get_metrics(["citations", timeframe], params, &block)
78
+ end
79
+
80
+ #Fetch altmetrics using (unstable) altmetrics ids
81
+ def id(id, &block)
82
+ return get_metrics(["id", id], &block)
83
+ end
84
+
85
+ #Fetch altmetrics for a Pubmed identifier
86
+ def pmid(id, &block)
87
+ return get_metrics(["pmid", id], &block)
88
+ end
89
+
90
+ #Fetch altmetrics for Arxiv id
91
+ def arxiv(id, &block)
92
+ return get_metrics(["arxiv", id], &block)
93
+ end
94
+
95
+ #Fetch altmetrics for ADS bibcode
96
+ def ads(id, &block)
97
+ return get_metrics(["ads", id], &block)
98
+ end
99
+
100
+ def fetch(type, id, params)
101
+ return get_metrics(["fetch", type, id], params, &block)
102
+ end
103
+
104
+ #Get metrics, specifying path, query parameters, and headers
105
+ #
106
+ #Accepts a block for direct processing of the result, otherwise
107
+ #response is validated to ensure its a success then parsed as JSON
108
+ def get_metrics(path, query={}, headers={})
109
+ url = Client::make_url(URI_TEMPLATE, {:path=>path} )
110
+ response = get( url, query, headers )
111
+ if block_given?
112
+ yield response
113
+ end
114
+ validate_response(response)
115
+ return JSON.parse( response.content )
116
+ end
117
+
118
+ def get(uri, query={}, headers={})
119
+ query[KEY_PARAM] = @apikey if @apikey
120
+ headers["Accept"] = "application/json"
121
+ response = @client.get(uri, query, headers)
122
+ Client.update_limits(response.headers)
123
+ return response
124
+ end
125
+
126
+ def validate_response(response)
127
+ if response.status != 200
128
+ raise "Unable to perform request. Status: #{response.status}. Message: #{response.content}"
129
+ end
130
+ end
131
+
132
+ end
133
+ end
@@ -0,0 +1,4 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'test/unit'
3
+
4
+ require 'tc_altmetric.rb'
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: altmetric.rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Leigh Dodds
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: httpclient
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: uri_template
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Altmetric API Client
63
+ email: leigh@ldodds.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files:
67
+ - README.md
68
+ files:
69
+ - README.md
70
+ - Rakefile
71
+ - bin/doi
72
+ - lib/altmetric.rb
73
+ - tests/ts_altmetric.rb
74
+ homepage: http://github.com/ldodds/altmetric
75
+ licenses: []
76
+ post_install_message:
77
+ rdoc_options:
78
+ - --quiet
79
+ - --title
80
+ - Altmetric Client
81
+ - --main
82
+ - README.md
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: 1.9.3
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 1.8.23
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: Altmetric API Client
103
+ test_files:
104
+ - tests/ts_altmetric.rb