red5 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/README.md +55 -1
- data/Rakefile +3 -1
- data/lib/red_5.rb +19 -0
- data/lib/red_5/exceptions/red_5_exception.rb +9 -0
- data/lib/red_5/helpers.rb +8 -0
- data/lib/red_5/models/entities.rb +54 -0
- data/lib/{red5 → red_5/models}/films.rb +1 -1
- data/lib/{red5 → red_5/models}/people.rb +1 -1
- data/lib/{red5 → red_5/models}/planets.rb +1 -1
- data/lib/{red5 → red_5/models}/species.rb +1 -1
- data/lib/{red5 → red_5/models}/starships.rb +1 -1
- data/lib/{red5 → red_5/models}/vehicles.rb +1 -1
- data/lib/{red5 → red_5}/root.rb +1 -1
- data/lib/red_5/version.rb +3 -0
- data/red5.gemspec +4 -1
- data/spec/cassettes/Failure/404s/raises_an_exception_on_a_ludicrous_request.yml +96 -0
- data/spec/cassettes/Failure/404s/raises_an_exception_on_a_non-existent_thing.yml +96 -0
- data/spec/cassettes/Failure/Non-existent_attributes/raises_an_exception_on_a_bogus_lookup.yml +101 -0
- data/spec/cassettes/Red5_Films/finds_a_particular_film.yml +111 -0
- data/spec/cassettes/Red5_Films/has_OpenStruct-type_lookups.yml +111 -0
- data/spec/cassettes/Red5_Films/returns_a_film.yml +111 -0
- data/spec/cassettes/Red5_People/fetches_the_species_for_a_person.yml +155 -0
- data/spec/cassettes/{Red_5_People/should_find_a_person.yml → Red5_People/finds_a_particular_person.yml} +13 -13
- data/spec/cassettes/Red5_People/has_an_id.yml +101 -0
- data/spec/cassettes/Red5_People/returns_a_person.yml +101 -0
- data/spec/cassettes/{Red_5_Planets/should_find_a_planet.yml → Red5_Planets/finds_a_planet.yml} +18 -18
- data/spec/cassettes/Red5_Species/fetches_the_homeworld_for_a_species.yml +157 -0
- data/spec/cassettes/Red5_Species/finds_a_homeworld_for_a_species.yml +101 -0
- data/spec/cassettes/Red5_Species/finds_a_species.yml +101 -0
- data/spec/cassettes/Red5_Starships/Failure/raises_an_exception_on_a_ludicrous_request.yml +96 -0
- data/spec/cassettes/Red5_Starships/Failure/raises_an_exception_on_a_non-existent_thing.yml +96 -0
- data/spec/cassettes/Red5_Starships/finds_a_starship.yml +102 -0
- data/spec/cassettes/Red5_Vehicles/finds_a_vehicle.yml +102 -0
- data/spec/cassettes/Red_5_Films/finds_a_particular_film.yml +111 -0
- data/spec/cassettes/Red_5_Films/returns_a_film.yml +111 -0
- data/spec/cassettes/Red_5_People/fetches_the_species_for_a_person.yml +155 -0
- data/spec/cassettes/Red_5_People/finds_a_particular_person.yml +101 -0
- data/spec/cassettes/Red_5_People/gets_the_species_for_a_person.yml +252 -0
- data/spec/cassettes/Red_5_People/has_an_id.yml +101 -0
- data/spec/cassettes/Red_5_People/returns_a_person.yml +101 -0
- data/spec/cassettes/Red_5_Species/fetches_the_homeworld_for_a_species.yml +157 -0
- data/spec/cassettes/Red_5_Species/finds_a_homeworld_for_a_species.yml +101 -0
- data/spec/cassettes/Red_5_Species/gets_the_homeworld_for_a_species.yml +157 -0
- data/spec/cassettes/Red_5_Starships/Failure/raises_an_exception_on_a_non-existent_thing.yml +96 -0
- data/spec/failure_spec.rb +31 -0
- data/spec/models/films_spec.rb +15 -0
- data/spec/models/people_spec.rb +25 -0
- data/spec/models/planets_spec.rb +10 -0
- data/spec/models/species_spec.rb +20 -0
- data/spec/models/starships_spec.rb +10 -0
- data/spec/models/vehicles_spec.rb +10 -0
- data/spec/red5_spec.rb +2 -45
- data/spec/spec_helper.rb +1 -1
- metadata +129 -17
- data/lib/red5.rb +0 -14
- data/lib/red5/entities.rb +0 -9
- data/lib/red5/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d84a79a3bcb4b6cca90a470703d6dca96f67c080
|
4
|
+
data.tar.gz: 203496fc2fd5b6590d8cb20fd75bd2aeb28f2319
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df3ef0cb1d6a0a11dd16dfff9267fbb9d684009e22f26617eca62272ef3a4d90501bc1d29d8c83fe3735954544da149ddbde5ff045ea1331afb8ca36a84f93a7
|
7
|
+
data.tar.gz: 7931602b478f9b31dbccfeaf02bdcdc3da19345c8a998913f3ab556bc46e21ffe3d4c060b68ccd5f01976cf8874ca003ad574380ef337dcdeb742e525d1873f5
|
data/.rspec
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,64 @@
|
|
1
1
|
[![Build Status](https://travis-ci.org/pikesley/red5.svg)](https://travis-ci.org/pikesley/red5)
|
2
2
|
[![Dependency Status](http://img.shields.io/gemnasium/pikesley/red5.svg)](https://gemnasium.com/pikesley/red5)
|
3
|
+
[![Coverage Status](http://img.shields.io/coveralls/pikesley/red5.svg)](https://coveralls.io/r/pikesley/red5)
|
3
4
|
[![Code Climate](http://img.shields.io/codeclimate/github/pikesley/red5.svg)](https://codeclimate.com/github/pikesley/red5)
|
4
5
|
[![Gem Version](http://img.shields.io/gem/v/red5.svg)](https://rubygems.org/gems/red5)
|
5
6
|
[![License](http://img.shields.io/:license-mit-blue.svg)](http://pikesley.mit-license.org)
|
6
|
-
[![Badges](http://img.shields.io/:badges-
|
7
|
+
[![Badges](http://img.shields.io/:badges-7/7-ff6799.svg)](https://github.com/badges/badgerbadgerbadger)
|
7
8
|
|
8
9
|
# Red5
|
9
10
|
|
10
11
|
Ruby bindings for the [Star Wars API](http://swapi.co)
|
12
|
+
|
13
|
+
git clone https://github.com/pikesley/red5
|
14
|
+
cd red5
|
15
|
+
bundle
|
16
|
+
rake
|
17
|
+
|
18
|
+
or just
|
19
|
+
|
20
|
+
gem install red5
|
21
|
+
|
22
|
+
##API
|
23
|
+
|
24
|
+
I've followed the [Star Wars API](http://swapi.co/documentation#intro) as closely as I can. It's probably best illustrated with some examples from the [specs](https://github.com/pikesley/red5/tree/master/spec):
|
25
|
+
|
26
|
+
###Get a thing
|
27
|
+
|
28
|
+
it 'finds a particular film', :vcr do
|
29
|
+
film = Films.find 1
|
30
|
+
expect(film['title']).to eq 'A New Hope'
|
31
|
+
expect(film['episode_id']).to eq 4
|
32
|
+
end
|
33
|
+
|
34
|
+
###Fetch the thing linked to by an attribute
|
35
|
+
|
36
|
+
it 'fetches the species for a person', :vcr do
|
37
|
+
person = People.find 15 # Greedo
|
38
|
+
expect(person.fetch_species[0]['name']).to eq 'Rodian'
|
39
|
+
end
|
40
|
+
|
41
|
+
##Exceptions
|
42
|
+
|
43
|
+
###Raise an exception on a 404
|
44
|
+
|
45
|
+
it 'raises an exception on a non-existent thing', :vcr do
|
46
|
+
expect{ Starships.find 999 }.to raise_exception do |exception|
|
47
|
+
expect(exception).to be_a Red5Exception
|
48
|
+
expect(exception.status).to eq 'Starship #999 does not exist'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
###Raise an exception on a bogus lookup
|
53
|
+
|
54
|
+
it 'raises an exception on a bogus lookup', :vcr do
|
55
|
+
person = People.find 19
|
56
|
+
expect{ person['favourite_food'] }. to raise_exception do |exception|
|
57
|
+
expect(exception).to be_a Red5Exception
|
58
|
+
expect(exception.status).to eq 'No such attribute favourite_food'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
##Further work
|
63
|
+
|
64
|
+
This seems to cover the basics, what else should it do?
|
data/Rakefile
CHANGED
data/lib/red_5.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'json'
|
3
|
+
require 'active_support/core_ext/string'
|
4
|
+
|
5
|
+
require 'red_5/version'
|
6
|
+
|
7
|
+
require 'red_5/helpers'
|
8
|
+
|
9
|
+
require 'red_5/root'
|
10
|
+
require 'red_5/models/entities'
|
11
|
+
|
12
|
+
require 'red_5/models/films'
|
13
|
+
require 'red_5/models/people'
|
14
|
+
require 'red_5/models/planets'
|
15
|
+
require 'red_5/models/species'
|
16
|
+
require 'red_5/models/starships'
|
17
|
+
require 'red_5/models/vehicles'
|
18
|
+
|
19
|
+
require 'red_5/exceptions/red_5_exception'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Red5
|
2
|
+
class Entities
|
3
|
+
def self.find id
|
4
|
+
basename = self.name.split('::').last
|
5
|
+
slug = basename.downcase
|
6
|
+
resource = RestClient::Resource.new "http://swapi.co/api/#{slug}/#{id}"
|
7
|
+
|
8
|
+
begin
|
9
|
+
self.new JSON.parse resource.get.body
|
10
|
+
rescue RestClient::ResourceNotFound
|
11
|
+
id = "##{id}" if id.is_a? Numeric
|
12
|
+
raise Red5Exception.new "#{basename.singularize} #{id} does not exist"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.first
|
17
|
+
self.find 1
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize data
|
21
|
+
@data = data
|
22
|
+
@data['id'] = @data['url'].split('/').last.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
def [] key
|
26
|
+
@data[key] || raise(Red5Exception.new "No such attribute #{key}")
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing method_name, *args
|
30
|
+
mname = method_name.to_s
|
31
|
+
parts = mname.split('_')
|
32
|
+
|
33
|
+
case parts[0]
|
34
|
+
when 'fetch'
|
35
|
+
key = parts[1]
|
36
|
+
url = self[key]
|
37
|
+
|
38
|
+
unless url.is_a? Array
|
39
|
+
expects_single_result = true
|
40
|
+
url = [url]
|
41
|
+
end
|
42
|
+
|
43
|
+
results = []
|
44
|
+
url.each do |u|
|
45
|
+
results.push Red5.fetch_results u
|
46
|
+
end
|
47
|
+
|
48
|
+
return results.first if expects_single_result
|
49
|
+
results
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/{red5 → red_5}/root.rb
RENAMED
data/red5.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require '
|
4
|
+
require 'red_5/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'red5'
|
@@ -19,12 +19,15 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_dependency 'rest_client', '~> 1.8'
|
22
|
+
spec.add_dependency 'activesupport', '~> 4.2'
|
22
23
|
|
23
24
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
24
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
25
26
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
26
27
|
spec.add_development_dependency 'guard', '~> 2.10'
|
27
28
|
spec.add_development_dependency 'guard-rspec', '~> 4.5'
|
29
|
+
spec.add_development_dependency 'terminal-notifier-guard', '~> 1.6'
|
28
30
|
spec.add_development_dependency 'vcr', '~> 2.9'
|
29
31
|
spec.add_development_dependency 'webmock', '~> 1.18'
|
32
|
+
spec.add_development_dependency 'coveralls', '~> 0.7'
|
30
33
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://swapi.co/api/starships/lolwut
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*; q=0.5, application/xml"
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip, deflate
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 301
|
19
|
+
message: MOVED PERMANENTLY
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Tue, 23 Dec 2014 14:22:11 GMT
|
23
|
+
Content-Type:
|
24
|
+
- text/html; charset=utf-8
|
25
|
+
Transfer-Encoding:
|
26
|
+
- chunked
|
27
|
+
Connection:
|
28
|
+
- keep-alive
|
29
|
+
Set-Cookie:
|
30
|
+
- __cfduid=df0a1ed34ef460f4111eea44ea9cff8401419344531; expires=Wed, 23-Dec-15
|
31
|
+
14:22:11 GMT; path=/; domain=.swapi.co; HttpOnly
|
32
|
+
Location:
|
33
|
+
- http://swapi.co/api/starships/lolwut/
|
34
|
+
X-Frame-Options:
|
35
|
+
- SAMEORIGIN
|
36
|
+
Via:
|
37
|
+
- 1.1 vegur
|
38
|
+
Server:
|
39
|
+
- cloudflare-nginx
|
40
|
+
Cf-Ray:
|
41
|
+
- 19d535b8a00a0a78-LHR
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: ''
|
45
|
+
http_version:
|
46
|
+
recorded_at: Tue, 23 Dec 2014 14:22:11 GMT
|
47
|
+
- request:
|
48
|
+
method: get
|
49
|
+
uri: http://swapi.co/api/starships/lolwut/
|
50
|
+
body:
|
51
|
+
encoding: US-ASCII
|
52
|
+
string: ''
|
53
|
+
headers:
|
54
|
+
Accept:
|
55
|
+
- "*/*; q=0.5, application/xml"
|
56
|
+
Accept-Encoding:
|
57
|
+
- gzip, deflate
|
58
|
+
Cookie:
|
59
|
+
- __cfduid=df0a1ed34ef460f4111eea44ea9cff8401419344531; domain=.swapi.co
|
60
|
+
User-Agent:
|
61
|
+
- Ruby
|
62
|
+
response:
|
63
|
+
status:
|
64
|
+
code: 404
|
65
|
+
message: NOT FOUND
|
66
|
+
headers:
|
67
|
+
Date:
|
68
|
+
- Tue, 23 Dec 2014 14:22:11 GMT
|
69
|
+
Content-Type:
|
70
|
+
- application/json
|
71
|
+
Transfer-Encoding:
|
72
|
+
- chunked
|
73
|
+
Connection:
|
74
|
+
- keep-alive
|
75
|
+
X-Frame-Options:
|
76
|
+
- SAMEORIGIN
|
77
|
+
Allow:
|
78
|
+
- GET, HEAD, OPTIONS
|
79
|
+
Vary:
|
80
|
+
- Accept, Cookie
|
81
|
+
Via:
|
82
|
+
- 1.1 vegur
|
83
|
+
Server:
|
84
|
+
- cloudflare-nginx
|
85
|
+
Cf-Ray:
|
86
|
+
- 19d535b95fb30a78-LHR
|
87
|
+
Content-Encoding:
|
88
|
+
- gzip
|
89
|
+
body:
|
90
|
+
encoding: ASCII-8BIT
|
91
|
+
string: !binary |-
|
92
|
+
H4sIAAAAAAAAA6pWSkktSczMUbJS8ssvUUjLL81LUaoFAAAA//8DAN21v3kW
|
93
|
+
AAAA
|
94
|
+
http_version:
|
95
|
+
recorded_at: Tue, 23 Dec 2014 14:22:11 GMT
|
96
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,96 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://swapi.co/api/starships/999
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*; q=0.5, application/xml"
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip, deflate
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 301
|
19
|
+
message: MOVED PERMANENTLY
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Tue, 23 Dec 2014 14:22:10 GMT
|
23
|
+
Content-Type:
|
24
|
+
- text/html; charset=utf-8
|
25
|
+
Transfer-Encoding:
|
26
|
+
- chunked
|
27
|
+
Connection:
|
28
|
+
- keep-alive
|
29
|
+
Set-Cookie:
|
30
|
+
- __cfduid=d746f256c535edd7334a2751938b9a4a71419344530; expires=Wed, 23-Dec-15
|
31
|
+
14:22:10 GMT; path=/; domain=.swapi.co; HttpOnly
|
32
|
+
Location:
|
33
|
+
- http://swapi.co/api/starships/999/
|
34
|
+
X-Frame-Options:
|
35
|
+
- SAMEORIGIN
|
36
|
+
Via:
|
37
|
+
- 1.1 vegur
|
38
|
+
Server:
|
39
|
+
- cloudflare-nginx
|
40
|
+
Cf-Ray:
|
41
|
+
- 19d535b39fe90a78-LHR
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: ''
|
45
|
+
http_version:
|
46
|
+
recorded_at: Tue, 23 Dec 2014 14:22:10 GMT
|
47
|
+
- request:
|
48
|
+
method: get
|
49
|
+
uri: http://swapi.co/api/starships/999/
|
50
|
+
body:
|
51
|
+
encoding: US-ASCII
|
52
|
+
string: ''
|
53
|
+
headers:
|
54
|
+
Accept:
|
55
|
+
- "*/*; q=0.5, application/xml"
|
56
|
+
Accept-Encoding:
|
57
|
+
- gzip, deflate
|
58
|
+
Cookie:
|
59
|
+
- __cfduid=d746f256c535edd7334a2751938b9a4a71419344530; domain=.swapi.co
|
60
|
+
User-Agent:
|
61
|
+
- Ruby
|
62
|
+
response:
|
63
|
+
status:
|
64
|
+
code: 404
|
65
|
+
message: NOT FOUND
|
66
|
+
headers:
|
67
|
+
Date:
|
68
|
+
- Tue, 23 Dec 2014 14:22:11 GMT
|
69
|
+
Content-Type:
|
70
|
+
- application/json
|
71
|
+
Transfer-Encoding:
|
72
|
+
- chunked
|
73
|
+
Connection:
|
74
|
+
- keep-alive
|
75
|
+
X-Frame-Options:
|
76
|
+
- SAMEORIGIN
|
77
|
+
Allow:
|
78
|
+
- GET, HEAD, OPTIONS
|
79
|
+
Vary:
|
80
|
+
- Accept, Cookie
|
81
|
+
Via:
|
82
|
+
- 1.1 vegur
|
83
|
+
Server:
|
84
|
+
- cloudflare-nginx
|
85
|
+
Cf-Ray:
|
86
|
+
- 19d535b58f9b0a78-LHR
|
87
|
+
Content-Encoding:
|
88
|
+
- gzip
|
89
|
+
body:
|
90
|
+
encoding: ASCII-8BIT
|
91
|
+
string: !binary |-
|
92
|
+
H4sIAAAAAAAAA6pWSkktSczMUbJS8ssvUUjLL81LUaoFAAAA//8DAN21v3kW
|
93
|
+
AAAA
|
94
|
+
http_version:
|
95
|
+
recorded_at: Tue, 23 Dec 2014 14:22:11 GMT
|
96
|
+
recorded_with: VCR 2.9.3
|