nobel 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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +97 -0
- data/Rakefile +15 -0
- data/lib/nobel.rb +25 -0
- data/lib/nobel/affiliation.rb +17 -0
- data/lib/nobel/api.rb +59 -0
- data/lib/nobel/config.rb +26 -0
- data/lib/nobel/country.rb +40 -0
- data/lib/nobel/laureate.rb +83 -0
- data/lib/nobel/prize.rb +42 -0
- data/lib/nobel/version.rb +5 -0
- data/nobel.gemspec +21 -0
- data/spec/fixtures/country.json +10 -0
- data/spec/fixtures/laureate.json +86 -0
- data/spec/fixtures/peace_prize.json +56 -0
- data/spec/nobel/affiliation_spec.rb +27 -0
- data/spec/nobel/api_spec.rb +42 -0
- data/spec/nobel/config_spec.rb +56 -0
- data/spec/nobel/country_spec.rb +57 -0
- data/spec/nobel/laureate_spec.rb +110 -0
- data/spec/nobel/prize_spec.rb +47 -0
- data/spec/nobel/version_spec.rb +11 -0
- data/spec/nobel_spec.rb +37 -0
- data/spec/spec_helper.rb +44 -0
- metadata +85 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Peter Hellberg
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Nobel
|
2
|
+
|
3
|
+
A small API client for the Nobel Prize API.
|
4
|
+
|
5
|
+
You can find out more on the official [Developer Zone](http://www.nobelprize.org/nobel_organizations/nobelmedia/nobelprize_org/developer/)
|
6
|
+
|
7
|
+
There is also an API Console on [API HQ](http://console.apihq.com/nobel-prize-api)
|
8
|
+
|
9
|
+
## Dependencies
|
10
|
+
|
11
|
+
Nope.
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
Add this line to your application's Gemfile:
|
16
|
+
|
17
|
+
gem 'nobel'
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
|
21
|
+
$ bundle
|
22
|
+
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
$ gem install nobel
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
It is probably a good idea to take a look in `specs`
|
30
|
+
|
31
|
+
### Prize
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# All Nobel Prizes in 2010
|
35
|
+
Nobel::Prize.all year: 2010
|
36
|
+
|
37
|
+
# All Peace Prizes
|
38
|
+
Nobel::Prize.all category: 'peace'
|
39
|
+
```
|
40
|
+
|
41
|
+
### Laureate
|
42
|
+
|
43
|
+
The laureate data contains their prizes (and affiliations)
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
# Find a Nobel Laureate by ID
|
47
|
+
nelly = Nobel::Laureate.find 640
|
48
|
+
|
49
|
+
# Show the categories Nelly won
|
50
|
+
nelly.categories #=> ["literature"]
|
51
|
+
|
52
|
+
# Show the years Nelly won
|
53
|
+
nelly.years #=> [1966]
|
54
|
+
|
55
|
+
# Find all living female Nobel Laureates
|
56
|
+
# (`query` is an alias to `all`)
|
57
|
+
Nobel::Laureate.query diedDate: '0000', gender: 'female'
|
58
|
+
```
|
59
|
+
|
60
|
+
### Country
|
61
|
+
|
62
|
+
The country data only contains the country code and name.
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
# To return a list of all known countries
|
66
|
+
Nobel::Country.all
|
67
|
+
|
68
|
+
# To find a specific country
|
69
|
+
Nobel::Country.find 'FR' #=> #<Nobel::Country:0x007fda82b78220 @code="FR", @name="France">
|
70
|
+
|
71
|
+
# You can also find by name
|
72
|
+
Nobel::Country.find 'Germany', :name #=> #<Nobel::Country:0x007fda82b90b40 @code="DE", @name="Germany">
|
73
|
+
```
|
74
|
+
|
75
|
+
### Configuration
|
76
|
+
|
77
|
+
Nothing needs to be configured out of the box, but you can change the
|
78
|
+
`api_host`, `api_version`, `json_parser`, `http_client` and `debug`
|
79
|
+
settings like this:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
Nobel.configure do |c|
|
83
|
+
c.api_host = 'nobel.api'
|
84
|
+
c.api_version = 'v42'
|
85
|
+
c.json_parser = ->(json) { Oj.load(json) }
|
86
|
+
c.http_client = MyOwnHttpClient
|
87
|
+
c.debug = true
|
88
|
+
end
|
89
|
+
```
|
90
|
+
|
91
|
+
## Contributing
|
92
|
+
|
93
|
+
1. Fork it
|
94
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
95
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
96
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
97
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rake/testtask"
|
4
|
+
require "bundler/gem_tasks"
|
5
|
+
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
Rake::TestTask.new(:spec) do |t|
|
9
|
+
t.test_files = FileList['spec/**/*_spec.rb']
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Console"
|
13
|
+
task :console do
|
14
|
+
exec 'pry -r./lib/nobel'
|
15
|
+
end
|
data/lib/nobel.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "nobel/api"
|
4
|
+
require "nobel/config"
|
5
|
+
require "nobel/country"
|
6
|
+
require "nobel/laureate"
|
7
|
+
require "nobel/affiliation"
|
8
|
+
require "nobel/prize"
|
9
|
+
require "nobel/version"
|
10
|
+
|
11
|
+
module Nobel
|
12
|
+
class << self
|
13
|
+
def configure(&block)
|
14
|
+
yield(config)
|
15
|
+
end
|
16
|
+
|
17
|
+
def config
|
18
|
+
@config ||= Config.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def api
|
22
|
+
@api ||= Api.new(config)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nobel
|
4
|
+
class Affiliation
|
5
|
+
attr_reader :name, :country, :city
|
6
|
+
|
7
|
+
def initialize(data = nil)
|
8
|
+
data ||= {}
|
9
|
+
|
10
|
+
data.tap do |d|
|
11
|
+
@name = d['name']
|
12
|
+
@country = d['country']
|
13
|
+
@city = d['city']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/nobel/api.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module Nobel
|
8
|
+
class Api
|
9
|
+
attr_accessor :config
|
10
|
+
|
11
|
+
def initialize(config)
|
12
|
+
@config = config
|
13
|
+
end
|
14
|
+
|
15
|
+
def prize(params = {})
|
16
|
+
get_json :prize, params
|
17
|
+
end
|
18
|
+
|
19
|
+
def laureate(params = {})
|
20
|
+
get_json :laureate, params
|
21
|
+
end
|
22
|
+
|
23
|
+
def country
|
24
|
+
get_json :country
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_json(endpoint, params = {})
|
28
|
+
load_json get("#{endpoint}.json", params)
|
29
|
+
end
|
30
|
+
|
31
|
+
def get(path, params = {})
|
32
|
+
uri = prepared_uri(path, params)
|
33
|
+
|
34
|
+
puts "GET: #{uri}" if @config.debug?
|
35
|
+
|
36
|
+
http_get(uri)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def http_get(uri)
|
42
|
+
@config.http_client.get(uri)
|
43
|
+
end
|
44
|
+
|
45
|
+
def load_json(doc)
|
46
|
+
@config.json_parser.call(doc)
|
47
|
+
end
|
48
|
+
|
49
|
+
def prepared_uri(endpoint, params = {})
|
50
|
+
endpoint_uri(endpoint).tap do |uri|
|
51
|
+
uri.query = URI.encode_www_form(params)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def endpoint_uri(endpoint)
|
56
|
+
URI.parse("#{@config.base_url}/#{endpoint}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/nobel/config.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nobel
|
4
|
+
class Config
|
5
|
+
attr_accessor :api_host, :api_version,
|
6
|
+
:json_parser, :http_client, :debug
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@api_host = 'api.nobelprize.org'
|
10
|
+
@api_version = 'v1'
|
11
|
+
@json_parser = ->(d) { JSON.parse(d) }
|
12
|
+
@http_client = Net::HTTP
|
13
|
+
@debug = false
|
14
|
+
|
15
|
+
yield self if block_given?
|
16
|
+
end
|
17
|
+
|
18
|
+
def base_url
|
19
|
+
"http://#{api_host}/#{api_version}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def debug?
|
23
|
+
debug
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nobel
|
4
|
+
class Country
|
5
|
+
class << self
|
6
|
+
def all
|
7
|
+
data.map { |c| new(c) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def find(value, key = 'code')
|
11
|
+
value = key == 'code' ? value.to_s.upcase : value.to_s
|
12
|
+
new data.detect { |c| c[key.to_s] == value }
|
13
|
+
end
|
14
|
+
|
15
|
+
def data
|
16
|
+
@data ||= get_data
|
17
|
+
end
|
18
|
+
|
19
|
+
def reload!
|
20
|
+
@data = get_data
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def get_data
|
27
|
+
Nobel.api.country['countries'] || []
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_reader :name, :code
|
32
|
+
|
33
|
+
def initialize(data)
|
34
|
+
data ||= { 'code' => 'ZZ', 'name' => 'Unknown' }
|
35
|
+
|
36
|
+
@name = data['name']
|
37
|
+
@code = data['code']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
module Nobel
|
6
|
+
class Laureate
|
7
|
+
class << self
|
8
|
+
def find(id)
|
9
|
+
data = get_data(id: id)
|
10
|
+
new(data.first) if data.any?
|
11
|
+
end
|
12
|
+
|
13
|
+
def all(params = {})
|
14
|
+
get_data(params).map { |c| new(c) }
|
15
|
+
end
|
16
|
+
|
17
|
+
alias :query :all
|
18
|
+
|
19
|
+
def get_data(params = {})
|
20
|
+
Nobel.api.laureate(params)['laureates'] || []
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :data, :id, :firstname, :surname, :share, :motivation,
|
25
|
+
:born, :born_city, :born_country, :born_country_code,
|
26
|
+
:died, :died_city, :died_country, :died_country_code
|
27
|
+
|
28
|
+
def initialize(data)
|
29
|
+
@data = data || {}
|
30
|
+
|
31
|
+
year_regex = /^\d{4}-[0-1][1-9]-\d{2}$/
|
32
|
+
|
33
|
+
@data.tap do |d|
|
34
|
+
@id = Integer(d['id'])
|
35
|
+
|
36
|
+
@firstname = d['firstname']
|
37
|
+
@surname = d['surname']
|
38
|
+
|
39
|
+
@share = Integer(d['share']) if d['share']
|
40
|
+
@motivation = d['motivation'] if d['motivation']
|
41
|
+
|
42
|
+
@born = Date.parse d['born'] if d['born'] =~ year_regex
|
43
|
+
@born_city = d['bornCity'] if d['bornCity']
|
44
|
+
@born_country = d['bornCountry'] if d['bornCountry']
|
45
|
+
@born_country_code = d['bornCountryCode'] if d['bornCountryCode']
|
46
|
+
|
47
|
+
@died = Date.parse d['died'] if d['died'] =~ year_regex
|
48
|
+
@died_city = d['diedCity'] if d['diedCity']
|
49
|
+
@died_country = d['diedCountry'] if d['diedCountry']
|
50
|
+
@died_country_code = d['diedCountryCode'] if d['diedCountryCode']
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def reload!
|
55
|
+
initialize self.class.get_data(id: id).first
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
def name
|
60
|
+
"#{firstname} #{surname}".strip
|
61
|
+
end
|
62
|
+
|
63
|
+
def prizes
|
64
|
+
@prizes ||= (data['prizes'] || []).map do |p|
|
65
|
+
Prize.new(p)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def categories
|
70
|
+
won(:category)
|
71
|
+
end
|
72
|
+
|
73
|
+
def years
|
74
|
+
won(:year)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def won(field)
|
80
|
+
prizes.map(&field).uniq
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/nobel/prize.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nobel
|
4
|
+
class Prize
|
5
|
+
class << self
|
6
|
+
def all(params = {})
|
7
|
+
get_data(params).map { |c| new(c) }
|
8
|
+
end
|
9
|
+
|
10
|
+
alias :query :all
|
11
|
+
|
12
|
+
def get_data(params = {})
|
13
|
+
Nobel.api.prize(params)['prizes'] || []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :data, :year, :category, :share, :motivation
|
18
|
+
|
19
|
+
def initialize(data)
|
20
|
+
@data = data || {}
|
21
|
+
|
22
|
+
@data.tap do |d|
|
23
|
+
@year = Integer(d['year'])
|
24
|
+
@category = d['category']
|
25
|
+
@share = Integer(d['share']) if d['share']
|
26
|
+
@motivation = d['motivation']
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def affiliations
|
31
|
+
@affiliations ||= (data['affiliations'] || []).map do |a|
|
32
|
+
Affiliation.new(a) if a.respond_to?(:has_key?)
|
33
|
+
end.compact
|
34
|
+
end
|
35
|
+
|
36
|
+
def laureates
|
37
|
+
@laureates ||= (data['laureates'] || []).map do |l|
|
38
|
+
Laureate.new(l)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/nobel.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'nobel/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.required_ruby_version = '>= 1.9.3'
|
9
|
+
|
10
|
+
gem.name = "nobel"
|
11
|
+
gem.version = Nobel::VERSION
|
12
|
+
gem.authors = ["Peter Hellberg"]
|
13
|
+
gem.email = ["peter@c7.se"]
|
14
|
+
gem.summary = %q{API client for the Nobel Prize API}
|
15
|
+
gem.homepage = "https://github.com/peterhellberg/nobel"
|
16
|
+
gem.license = 'MIT'
|
17
|
+
|
18
|
+
gem.files = `git ls-files`.split($/)
|
19
|
+
gem.test_files = gem.files.grep(%r{^spec/})
|
20
|
+
gem.require_paths = ["lib"]
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
{
|
2
|
+
"countries":[
|
3
|
+
{"name":"Germany (now Russia)","code":"RU"},
|
4
|
+
{"name":"Tuscany (now Italy)","code":"IT"},
|
5
|
+
{"name":"Poland (now Lithuania)","code":"LT"},
|
6
|
+
{"name":"Madagascar","code":"MG"},
|
7
|
+
{"name":"Free City of Danzig (now Poland)","code":"PL"},
|
8
|
+
{"name":"Austrian Empire (now Czech Republic)","code":"CZ"}
|
9
|
+
]
|
10
|
+
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
{
|
2
|
+
"laureates": [
|
3
|
+
{
|
4
|
+
"id": "79",
|
5
|
+
"firstname": "Maria",
|
6
|
+
"surname": "Goeppert Mayer",
|
7
|
+
"born": "1906-06-28",
|
8
|
+
"died": "1972-02-20",
|
9
|
+
"bornCountry": "Germany (now Poland)",
|
10
|
+
"bornCountryCode": "PL",
|
11
|
+
"bornCity": "Kattowitz (now Katowice)",
|
12
|
+
"diedCountry": "USA",
|
13
|
+
"diedCountryCode": "US",
|
14
|
+
"diedCity": "San Diego, CA",
|
15
|
+
"gender": "female",
|
16
|
+
"prizes": [
|
17
|
+
{
|
18
|
+
"year": "1963",
|
19
|
+
"category": "physics",
|
20
|
+
"share": "4",
|
21
|
+
"motivation": "\"for their discoveries concerning nuclear shell structure\"",
|
22
|
+
"affiliations": [
|
23
|
+
{
|
24
|
+
"name": "University of California",
|
25
|
+
"city": "La Jolla, CA",
|
26
|
+
"country": "USA"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}
|
30
|
+
]
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"id": "453",
|
34
|
+
"firstname": "Christiane",
|
35
|
+
"surname": "Nüsslein-Volhard",
|
36
|
+
"born": "1942-10-20",
|
37
|
+
"died": "0000-00-00",
|
38
|
+
"bornCountry": "Germany",
|
39
|
+
"bornCountryCode": "DE",
|
40
|
+
"bornCity": "Magdeburg",
|
41
|
+
"gender": "female",
|
42
|
+
"prizes": [
|
43
|
+
{
|
44
|
+
"year": "1995",
|
45
|
+
"category": "medicine",
|
46
|
+
"share": "3",
|
47
|
+
"motivation": "\"for their discoveries concerning the genetic control of early embryonic development\"",
|
48
|
+
"affiliations": [
|
49
|
+
{
|
50
|
+
"name": "Max-Planck-Institut für Entwicklungsbiologie",
|
51
|
+
"city": "Tübingen",
|
52
|
+
"country": "Federal Republic of Germany"
|
53
|
+
}
|
54
|
+
]
|
55
|
+
}
|
56
|
+
]
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"id": "640",
|
60
|
+
"firstname": "Nelly",
|
61
|
+
"surname": "Sachs",
|
62
|
+
"born": "1891-12-10",
|
63
|
+
"died": "1970-05-12",
|
64
|
+
"bornCountry": "Germany",
|
65
|
+
"bornCountryCode": "DE",
|
66
|
+
"bornCity": "Berlin",
|
67
|
+
"diedCountry": "Sweden",
|
68
|
+
"diedCountryCode": "SE",
|
69
|
+
"diedCity": "Stockholm",
|
70
|
+
"gender": "female",
|
71
|
+
"prizes": [
|
72
|
+
{
|
73
|
+
"year": "1966",
|
74
|
+
"category": "literature",
|
75
|
+
"share": "2",
|
76
|
+
"motivation": "\"for her outstanding lyrical and dramatic writing, which interprets Israel's destiny with touching strength\" ",
|
77
|
+
"affiliations": [
|
78
|
+
[
|
79
|
+
|
80
|
+
]
|
81
|
+
]
|
82
|
+
}
|
83
|
+
]
|
84
|
+
}
|
85
|
+
]
|
86
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
{
|
2
|
+
"prizes": [
|
3
|
+
{
|
4
|
+
"year": "2012",
|
5
|
+
"category": "peace",
|
6
|
+
"laureates": [
|
7
|
+
{
|
8
|
+
"id": "881",
|
9
|
+
"firstname": "European Union (EU)",
|
10
|
+
"motivation": ""for over six decades contributed to the advancement of peace and reconciliation, democracy and human rights in Europe"",
|
11
|
+
"share": "1"
|
12
|
+
}
|
13
|
+
]
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"year": "2011",
|
17
|
+
"category": "peace",
|
18
|
+
"laureates": [
|
19
|
+
{
|
20
|
+
"id": "869",
|
21
|
+
"firstname": "Ellen",
|
22
|
+
"surname": "Johnson Sirleaf",
|
23
|
+
"motivation": ""for their non-violent struggle for the safety of women and for women’s rights to full participation in peace-building work"",
|
24
|
+
"share": "3"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"id": "870",
|
28
|
+
"firstname": "Leymah",
|
29
|
+
"surname": "Gbowee",
|
30
|
+
"motivation": ""for their non-violent struggle for the safety of women and for women’s rights to full participation in peace-building work"",
|
31
|
+
"share": "3"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"id": "871",
|
35
|
+
"firstname": "Tawakkol",
|
36
|
+
"surname": "Karman",
|
37
|
+
"motivation": ""for their non-violent struggle for the safety of women and for women’s rights to full participation in peace-building work"",
|
38
|
+
"share": "3"
|
39
|
+
}
|
40
|
+
]
|
41
|
+
},
|
42
|
+
{
|
43
|
+
"year": "2010",
|
44
|
+
"category": "peace",
|
45
|
+
"laureates": [
|
46
|
+
{
|
47
|
+
"id": "855",
|
48
|
+
"firstname": "Liu",
|
49
|
+
"surname": "Xiaobo",
|
50
|
+
"motivation": ""for his long and non-violent struggle for fundamental human rights in China"",
|
51
|
+
"share": "1"
|
52
|
+
}
|
53
|
+
]
|
54
|
+
}
|
55
|
+
]
|
56
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe "Affiliation" do
|
6
|
+
subject { Nobel::Affiliation }
|
7
|
+
|
8
|
+
it "can be blank" do
|
9
|
+
a = subject.new
|
10
|
+
|
11
|
+
a.name.must_equal nil
|
12
|
+
a.country.must_equal nil
|
13
|
+
a.city.must_equal nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns the affiliation name" do
|
17
|
+
subject.new('name' => 'foo').name.must_equal 'foo'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns the affiliation country" do
|
21
|
+
subject.new('country' => 'bar').country.must_equal 'bar'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns the affiliation city" do
|
25
|
+
subject.new('city' => 'baz').city.must_equal 'baz'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe "Api" do
|
6
|
+
subject { Nobel::Api.new(config) }
|
7
|
+
|
8
|
+
let(:config) {
|
9
|
+
Nobel::Config.new.tap do |c|
|
10
|
+
c.api_host = api_host
|
11
|
+
c.api_version = api_version
|
12
|
+
c.http_client = BounceURI
|
13
|
+
end
|
14
|
+
}
|
15
|
+
|
16
|
+
let(:api_host) { 'api.test' }
|
17
|
+
let(:api_version) { '42' }
|
18
|
+
|
19
|
+
describe "get" do
|
20
|
+
it "should print debugging info if @config.debug?" do
|
21
|
+
->{
|
22
|
+
subject.config.debug = true
|
23
|
+
subject.get('foo') }.must_output "GET: http://api.test/42/foo?\n"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "country" do
|
28
|
+
it "parses the country.json" do
|
29
|
+
subject.stub(:http_get, fixture(:country)) do
|
30
|
+
subject.country['countries'].first['name'].must_equal 'Germany (now Russia)'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "get_json" do
|
36
|
+
it "returns parsed json" do
|
37
|
+
subject.stub(:http_get, fixture(:country)) do
|
38
|
+
subject.get_json(:country)['countries'][2]['code'].must_equal 'LT'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe "Config" do
|
6
|
+
subject {
|
7
|
+
Nobel::Config.new do |c|
|
8
|
+
c.api_host = api_host
|
9
|
+
c.api_version = api_version
|
10
|
+
end
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:api_host) { 'config.test' }
|
14
|
+
let(:api_version) { '2' }
|
15
|
+
|
16
|
+
it "returns the api_host" do
|
17
|
+
subject.api_host.must_equal api_host
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns the api_version" do
|
21
|
+
subject.api_version.must_equal api_version
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns the base_url" do
|
25
|
+
subject.base_url.must_equal 'http://config.test/2'
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "json_parser" do
|
29
|
+
it "is a lambda by default" do
|
30
|
+
subject.json_parser.
|
31
|
+
call('{"foo":123}')['foo'].must_equal 123
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can be changed" do
|
35
|
+
subject.json_parser = "foo"
|
36
|
+
subject.json_parser.must_equal "foo"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "http_client" do
|
41
|
+
it "is Net::HTTP by default" do
|
42
|
+
subject.http_client.must_equal Net::HTTP
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can be changed" do
|
46
|
+
subject.http_client = "bar"
|
47
|
+
subject.http_client.must_equal "bar"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "responds to debug?" do
|
52
|
+
subject.debug?.must_equal false
|
53
|
+
subject.debug = true
|
54
|
+
subject.debug?.must_equal true
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe "Country" do
|
6
|
+
subject { Nobel::Country }
|
7
|
+
|
8
|
+
describe "all" do
|
9
|
+
it "returns all the known countries" do
|
10
|
+
with_fixture :country do
|
11
|
+
subject.all.tap do |a|
|
12
|
+
a.size.must_equal 6
|
13
|
+
a.last.code.must_equal 'CZ'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "find" do
|
20
|
+
it "retrieves based on the code per default" do
|
21
|
+
with_fixture :country do
|
22
|
+
subject.find(:mg).name.must_equal 'Madagascar'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can also find based on the name" do
|
27
|
+
with_fixture :country do
|
28
|
+
subject.find('Tuscany (now Italy)', :name).code.must_equal 'IT'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "data" do
|
34
|
+
it "retrieves the country data" do
|
35
|
+
with_fixture :country do
|
36
|
+
subject.data.must_equal country_data
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "reload!" do
|
42
|
+
it "reloads the data" do
|
43
|
+
with_fixture :country do
|
44
|
+
subject.instance_eval do
|
45
|
+
data.must_equal country_data
|
46
|
+
|
47
|
+
@data = []
|
48
|
+
data.must_equal []
|
49
|
+
|
50
|
+
reload!
|
51
|
+
|
52
|
+
data.must_equal country_data
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe "Laureate" do
|
6
|
+
subject { Nobel::Laureate }
|
7
|
+
|
8
|
+
let(:nelly) {
|
9
|
+
subject.new(parsed_fixture(:laureate)["laureates"][2])
|
10
|
+
}
|
11
|
+
|
12
|
+
describe "find" do
|
13
|
+
it "finds a laureate based on id" do
|
14
|
+
with_data([parsed_fixture(:laureate)["laureates"][1]]) do
|
15
|
+
l = subject.find(453)
|
16
|
+
|
17
|
+
last_params.must_equal id: 453
|
18
|
+
|
19
|
+
l.name.must_equal 'Christiane Nüsslein-Volhard'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "all" do
|
25
|
+
it "returns all laureates per default" do
|
26
|
+
with_data(parsed_fixture(:laureate)["laureates"]) do
|
27
|
+
laureates = subject.all
|
28
|
+
laureates.size.must_equal 3
|
29
|
+
|
30
|
+
last_params.must_equal({})
|
31
|
+
|
32
|
+
laureates[2].name.must_equal 'Nelly Sachs'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "queries using a params hash" do
|
37
|
+
with_data([]) do
|
38
|
+
params = { bornDate: 1960 }
|
39
|
+
subject.query(params)
|
40
|
+
last_params.must_equal params
|
41
|
+
|
42
|
+
params = { diedCity: 'Stockholm' }
|
43
|
+
subject.query(params)
|
44
|
+
last_params.must_equal params
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "initialize" do
|
50
|
+
it "populates the accessors" do
|
51
|
+
nelly.instance_eval do
|
52
|
+
id.must_equal 640
|
53
|
+
|
54
|
+
firstname.must_equal "Nelly"
|
55
|
+
surname.must_equal "Sachs"
|
56
|
+
|
57
|
+
share.must_equal nil
|
58
|
+
motivation.must_equal nil
|
59
|
+
|
60
|
+
born.year.must_equal 1891
|
61
|
+
born_city.must_equal "Berlin"
|
62
|
+
born_country.must_equal "Germany"
|
63
|
+
born_country_code.must_equal "DE"
|
64
|
+
|
65
|
+
died.year.must_equal 1970
|
66
|
+
died_city.must_equal "Stockholm"
|
67
|
+
died_country.must_equal "Sweden"
|
68
|
+
died_country_code.must_equal "SE"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "reload!" do
|
74
|
+
it "reloads the data" do
|
75
|
+
with_data([parsed_fixture(:laureate)["laureates"][2]]) do
|
76
|
+
subject.new('id' => 640).instance_eval do
|
77
|
+
name.must_equal ''
|
78
|
+
reload!
|
79
|
+
name.must_equal 'Nelly Sachs'
|
80
|
+
end
|
81
|
+
|
82
|
+
last_params.must_equal({ id: 640 })
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "name" do
|
88
|
+
it "returns the firstname and surname" do
|
89
|
+
nelly.name.must_equal "Nelly Sachs"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "prizes" do
|
94
|
+
it "returns an Array of Prize objects" do
|
95
|
+
nelly.prizes.first.year.must_equal 1966
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "categories" do
|
100
|
+
it "returns a list of categories won" do
|
101
|
+
nelly.categories.must_equal(["literature"])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "years" do
|
106
|
+
it "returns a list of years won" do
|
107
|
+
nelly.years.must_equal([1966])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe "Prize" do
|
6
|
+
subject { Nobel::Prize }
|
7
|
+
|
8
|
+
let(:peace_2012) {
|
9
|
+
subject.new(parsed_fixture(:peace_prize)["prizes"][0])
|
10
|
+
}
|
11
|
+
|
12
|
+
describe "all" do
|
13
|
+
it "returns all prizes per default" do
|
14
|
+
with_data(parsed_fixture(:peace_prize)["prizes"]) do
|
15
|
+
prizes = subject.query
|
16
|
+
prizes.size.must_equal 3
|
17
|
+
|
18
|
+
last_params.must_equal({})
|
19
|
+
|
20
|
+
prizes[2].year.must_equal 2010
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "queries using a params hash" do
|
25
|
+
with_data([]) do
|
26
|
+
params = { bornDate: 1960 }
|
27
|
+
subject.query(params)
|
28
|
+
last_params.must_equal params
|
29
|
+
|
30
|
+
params = { diedCity: 'Stockholm' }
|
31
|
+
subject.query(params)
|
32
|
+
last_params.must_equal params
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "initialize" do
|
38
|
+
it "populates the accessors" do
|
39
|
+
peace_2012.instance_eval do
|
40
|
+
year.must_equal 2012
|
41
|
+
category.must_equal "peace"
|
42
|
+
share.must_equal nil
|
43
|
+
motivation.must_equal nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/spec/nobel_spec.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe "Nobel" do
|
4
|
+
subject { Nobel }
|
5
|
+
|
6
|
+
describe "configure" do
|
7
|
+
it "can be configured" do
|
8
|
+
subject.config.api_version.must_equal 'v1'
|
9
|
+
|
10
|
+
subject.configure do |c|
|
11
|
+
c.api_version = 'v2'
|
12
|
+
end
|
13
|
+
|
14
|
+
subject.config.api_version.must_equal 'v2'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "can change the json parser lamda" do
|
18
|
+
subject.configure do |c|
|
19
|
+
c.json_parser = ->{ 'foo' }
|
20
|
+
end
|
21
|
+
|
22
|
+
subject.config.json_parser.call.must_equal 'foo'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "config" do
|
27
|
+
it "returns a (default) config object" do
|
28
|
+
subject.config.must_be_instance_of Nobel::Config
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "api" do
|
33
|
+
it "returns a (default) api object" do
|
34
|
+
subject.api.must_be_instance_of Nobel::Api
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "minitest/spec"
|
4
|
+
require "minitest/pride"
|
5
|
+
require "minitest/autorun"
|
6
|
+
|
7
|
+
require_relative "../lib/nobel"
|
8
|
+
|
9
|
+
class BounceURI
|
10
|
+
def self.get(uri)
|
11
|
+
uri
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Nobel.configure do |c|
|
16
|
+
c.http_client = BounceURI
|
17
|
+
end
|
18
|
+
|
19
|
+
$loaded_fixtures = {}
|
20
|
+
|
21
|
+
def fixture(name)
|
22
|
+
$loaded_fixtures[name] ||= IO.read("spec/fixtures/#{name}.json")
|
23
|
+
end
|
24
|
+
|
25
|
+
def parsed_fixture(name)
|
26
|
+
JSON.parse fixture(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def with_fixture(name, &block)
|
30
|
+
Nobel.api.stub(:get_json, parsed_fixture(name), &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def with_data(data, &block)
|
34
|
+
@last_params = nil
|
35
|
+
subject.stub :get_data, ->(params){ @last_params = params; data }, &block
|
36
|
+
end
|
37
|
+
|
38
|
+
def last_params
|
39
|
+
@last_params
|
40
|
+
end
|
41
|
+
|
42
|
+
def country_data
|
43
|
+
parsed_fixture(:country)['countries']
|
44
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nobel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Peter Hellberg
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-30 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email:
|
16
|
+
- peter@c7.se
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- LICENSE.txt
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- lib/nobel.rb
|
27
|
+
- lib/nobel/affiliation.rb
|
28
|
+
- lib/nobel/api.rb
|
29
|
+
- lib/nobel/config.rb
|
30
|
+
- lib/nobel/country.rb
|
31
|
+
- lib/nobel/laureate.rb
|
32
|
+
- lib/nobel/prize.rb
|
33
|
+
- lib/nobel/version.rb
|
34
|
+
- nobel.gemspec
|
35
|
+
- spec/fixtures/country.json
|
36
|
+
- spec/fixtures/laureate.json
|
37
|
+
- spec/fixtures/peace_prize.json
|
38
|
+
- spec/nobel/affiliation_spec.rb
|
39
|
+
- spec/nobel/api_spec.rb
|
40
|
+
- spec/nobel/config_spec.rb
|
41
|
+
- spec/nobel/country_spec.rb
|
42
|
+
- spec/nobel/laureate_spec.rb
|
43
|
+
- spec/nobel/prize_spec.rb
|
44
|
+
- spec/nobel/version_spec.rb
|
45
|
+
- spec/nobel_spec.rb
|
46
|
+
- spec/spec_helper.rb
|
47
|
+
homepage: https://github.com/peterhellberg/nobel
|
48
|
+
licenses:
|
49
|
+
- MIT
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.9.3
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.8.24
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: API client for the Nobel Prize API
|
72
|
+
test_files:
|
73
|
+
- spec/fixtures/country.json
|
74
|
+
- spec/fixtures/laureate.json
|
75
|
+
- spec/fixtures/peace_prize.json
|
76
|
+
- spec/nobel/affiliation_spec.rb
|
77
|
+
- spec/nobel/api_spec.rb
|
78
|
+
- spec/nobel/config_spec.rb
|
79
|
+
- spec/nobel/country_spec.rb
|
80
|
+
- spec/nobel/laureate_spec.rb
|
81
|
+
- spec/nobel/prize_spec.rb
|
82
|
+
- spec/nobel/version_spec.rb
|
83
|
+
- spec/nobel_spec.rb
|
84
|
+
- spec/spec_helper.rb
|
85
|
+
has_rdoc:
|