marvell 0.1.0
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.
- checksums.yaml +7 -0
- data/Gemfile +7 -0
- data/Rakefile +5 -0
- data/lib/marvell/client.rb +114 -0
- data/lib/marvell/entity.rb +21 -0
- data/lib/marvell/json_parser.rb +7 -0
- data/lib/marvell.rb +3 -0
- data/spec/fixtures/dish_cassettes/character.yml +86 -0
- data/spec/fixtures/dish_cassettes/requests.yml +11233 -0
- data/spec/lib/character_spec.rb +55 -0
- data/spec/lib/client_spec.rb +178 -0
- data/spec/lib/comic_spec.rb +29 -0
- data/spec/lib/entity_spec.rb +18 -0
- data/spec/spec_helper.rb +13 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 82ec316e47d8c0686b2a8c42f3458535ba4bc22e
|
4
|
+
data.tar.gz: fa2498c4d0d8f63d18e25601bae0a21fecbbb5cf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a1b5b07a6a209f11b2ecc31d0c1b6b44c97ec45411439d76e0ea3d92005c672e9b0d7892ba04783e59265d1411bb755ab2c88f519569089d4b7539194e7edaee
|
7
|
+
data.tar.gz: d36b81c95c8d4e82679b5c5c450a78837c69fe6f54f6f4c4dde15d49d4ae141a6494fd4dca45384634e153f954c9d63ec79fbc4790704e411544fd7617c6697f
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require "httparty"
|
2
|
+
require "digest/md5"
|
3
|
+
|
4
|
+
module Marvell
|
5
|
+
class Client
|
6
|
+
include HTTParty
|
7
|
+
base_uri "gateway.marvel.com"
|
8
|
+
|
9
|
+
def initialize(params)
|
10
|
+
@public_key = params[:public_key]
|
11
|
+
@private_key = params[:private_key]
|
12
|
+
end
|
13
|
+
attr_reader :public_key, :private_key
|
14
|
+
|
15
|
+
# Takes a character ID
|
16
|
+
def character(params)
|
17
|
+
characters(id: params[:id]).first
|
18
|
+
end
|
19
|
+
|
20
|
+
def characters(params = {})
|
21
|
+
get_and_parse_collection "characters", params
|
22
|
+
end
|
23
|
+
|
24
|
+
def comic(params)
|
25
|
+
comics(id: params[:id]).first
|
26
|
+
end
|
27
|
+
|
28
|
+
def comics(params = {})
|
29
|
+
get_and_parse_collection "comics", params
|
30
|
+
end
|
31
|
+
|
32
|
+
def creator(params)
|
33
|
+
creators(id: params[:id]).first
|
34
|
+
end
|
35
|
+
|
36
|
+
def creators(params = {})
|
37
|
+
get_and_parse_collection "creators", params
|
38
|
+
end
|
39
|
+
|
40
|
+
def story(params)
|
41
|
+
stories(id: params[:id]).first
|
42
|
+
end
|
43
|
+
|
44
|
+
def stories(params = {})
|
45
|
+
get_and_parse_collection "stories", params
|
46
|
+
end
|
47
|
+
|
48
|
+
def serie(params)
|
49
|
+
series(id: params[:id]).first
|
50
|
+
end
|
51
|
+
|
52
|
+
def series(params = {})
|
53
|
+
get_and_parse_collection "series", params
|
54
|
+
end
|
55
|
+
|
56
|
+
def event(params)
|
57
|
+
events(id: params[:id]).first
|
58
|
+
end
|
59
|
+
|
60
|
+
def events(params = {})
|
61
|
+
get_and_parse_collection "events", params
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def get_and_parse_collection(name, params)
|
67
|
+
url = "/v1/public/"
|
68
|
+
url += primary_resource(params)
|
69
|
+
url += "/#{name}"
|
70
|
+
url += "/#{params.delete(:id)}" if params[:id]
|
71
|
+
|
72
|
+
result = self.class.get(url, query: auth_params.merge(params))
|
73
|
+
if result['code'] == 200
|
74
|
+
parse_collection(result)
|
75
|
+
else
|
76
|
+
return result
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def primary_resource(params)
|
81
|
+
if params[:series_id]
|
82
|
+
"series/#{params.delete(:series_id)}"
|
83
|
+
elsif params[:story_id]
|
84
|
+
"stories/#{params.delete(:story_id)}"
|
85
|
+
elsif params[:event_id]
|
86
|
+
"events/#{params.delete(:event_id)}"
|
87
|
+
elsif params[:comic_id]
|
88
|
+
"comics/#{params.delete(:comic_id)}"
|
89
|
+
elsif params[:creator_id]
|
90
|
+
"events/#{params.delete(:creator_id)}"
|
91
|
+
else
|
92
|
+
""
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_collection(result)
|
97
|
+
entities = Marvell::JsonParser.parse_result_set(result)
|
98
|
+
entities.collect do |entity|
|
99
|
+
Marvell::Entity.new(entity)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def auth_params
|
104
|
+
timestamp = 1
|
105
|
+
hash = auth_hash(ts: timestamp)
|
106
|
+
return {ts: timestamp, apikey: public_key, hash: hash}
|
107
|
+
end
|
108
|
+
|
109
|
+
def auth_hash(params)
|
110
|
+
value = params[:ts].to_s+private_key.to_s+public_key.to_s
|
111
|
+
Digest::MD5.hexdigest(value)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Marvell
|
2
|
+
class Entity
|
3
|
+
def initialize(json_result)
|
4
|
+
@result = json_result
|
5
|
+
end
|
6
|
+
attr_reader :result
|
7
|
+
|
8
|
+
def method_missing(method_name, *arguments, &block)
|
9
|
+
attribute = result[method_name.to_s.camel_case]
|
10
|
+
attribute ? attribute : super
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class String
|
18
|
+
def camel_case
|
19
|
+
self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
|
20
|
+
end
|
21
|
+
end
|
data/lib/marvell.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://gateway.marvel.com/v1/public//characters/1009521?apikey=07e4dc912806b1c5d1e51687095bca09&hash=0db5e378a0838a56ec2e8fadcc495e9a&ts=1
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Etag:
|
16
|
+
- 9a3c31018e37345cce34998b3e7e932665ead9c1
|
17
|
+
Content-Type:
|
18
|
+
- application/json
|
19
|
+
Content-Length:
|
20
|
+
- '7285'
|
21
|
+
Date:
|
22
|
+
- Sun, 09 Feb 2014 05:45:46 GMT
|
23
|
+
Connection:
|
24
|
+
- keep-alive
|
25
|
+
body:
|
26
|
+
encoding: UTF-8
|
27
|
+
string: '{"code":200,"status":"Ok","etag":"9a3c31018e37345cce34998b3e7e932665ead9c1","data":{"offset":0,"limit":20,"total":1,"count":1,"results":[{"id":1009521,"name":"
|
28
|
+
Hank Pym","description":"","modified":"1969-12-31T19:00:00-0500","thumbnail":{"path":"http://i.annihil.us/u/prod/marvel/i/mg/8/c0/4ce5a0e31f109","extension":"jpg"},"resourceURI":"http://gateway.marvel.com/v1/public/characters/1009521","comics":{"available":44,"collectionURI":"http://gateway.marvel.com/v1/public/characters/1009521/comics","items":[{"resourceURI":"http://gateway.marvel.com/v1/public/comics/35533","name":"Amazing
|
29
|
+
Spider-Man (1999) #661"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/39041","name":"Amazing
|
30
|
+
Spider-Man (1999) #661 (X-Men Art Variant)"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/35534","name":"Amazing
|
31
|
+
Spider-Man (1999) #662"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/7336","name":"Avengers
|
32
|
+
(1963) #83"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/7353","name":"Avengers
|
33
|
+
(1963) #99"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/6995","name":"Avengers
|
34
|
+
(1963) #138"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/7004","name":"Avengers
|
35
|
+
(1963) #146"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/7015","name":"Avengers
|
36
|
+
(1963) #156"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/29213","name":"Avengers
|
37
|
+
Academy (2010) #1"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/36770","name":"Avengers
|
38
|
+
Academy (2010) #1 (2ND PRINTING VARIANT)"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/34490","name":"Avengers
|
39
|
+
Academy (2010) #1 (DJURDJEVIC VARIANT)"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/29217","name":"Avengers
|
40
|
+
Academy (2010) #2"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/36482","name":"Avengers
|
41
|
+
Academy (2010) #15"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/36479","name":"Avengers
|
42
|
+
Academy (2010) #18"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/36489","name":"Avengers
|
43
|
+
Academy (2010) #21"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/29324","name":"Avengers
|
44
|
+
Academy Vol 1 : Permanent Record TPB (Trade Paperback)"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/6040","name":"Beyond!
|
45
|
+
(Hardcover)"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/4447","name":"Beyond!
|
46
|
+
(2006) #1"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/30015","name":"Incredible
|
47
|
+
Hulks (2009) #607 (MCGUINNESS VARIANT)"},{"resourceURI":"http://gateway.marvel.com/v1/public/comics/13477","name":"Mighty
|
48
|
+
Avengers (2007) #3"}],"returned":20},"series":{"available":11,"collectionURI":"http://gateway.marvel.com/v1/public/characters/1009521/series","items":[{"resourceURI":"http://gateway.marvel.com/v1/public/series/454","name":"Amazing
|
49
|
+
Spider-Man (1999 - 2013)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/1991","name":"Avengers
|
50
|
+
(1963 - 1996)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/9086","name":"Avengers
|
51
|
+
Academy (2010 - 2012)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/10037","name":"Avengers
|
52
|
+
Academy Vol 1 : Permanent Record TPB (2011)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/997","name":"Beyond!
|
53
|
+
(2006)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/1928","name":"Beyond!
|
54
|
+
(2007)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/8842","name":"Incredible
|
55
|
+
Hulks (2009 - 2011)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/1866","name":"Mighty
|
56
|
+
Avengers (2007 - 2010)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/5381","name":"Mighty
|
57
|
+
Avengers Vol. 1: The Ultron Initiative (2008)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/12877","name":"The
|
58
|
+
Iron Age (2010 - 2011)"},{"resourceURI":"http://gateway.marvel.com/v1/public/series/2715","name":"Women
|
59
|
+
of Marvel Vol. 2 (2007)"}],"returned":11},"stories":{"available":43,"collectionURI":"http://gateway.marvel.com/v1/public/characters/1009521/stories","items":[{"resourceURI":"http://gateway.marvel.com/v1/public/stories/5621","name":"1
|
60
|
+
of 6 - 6XLS","type":"cover"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/8682","name":"3
|
61
|
+
of 6 - Ultron; THE INITIATIVE BANNER","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/14528","name":"Stranger
|
62
|
+
in a Strange Man!","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/14546","name":"The
|
63
|
+
Assassin Never Fails!","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/14568","name":"The
|
64
|
+
Private War of Doctor Doom!","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/15235","name":"Come
|
65
|
+
On In, The Revolution''s Fine","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/15269","name":"They
|
66
|
+
First Make Mad","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/32378","name":"4
|
67
|
+
of 6 - Ultron; THE INITIATIVE BANNER","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/36886","name":"Venom
|
68
|
+
Bomb 2 of 5","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/44681","name":"Venom
|
69
|
+
Bomb 5 of 5","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/47781","name":"Secret
|
70
|
+
Invasion 6 of 8","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/52267","name":"2
|
71
|
+
of 6","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/52726","name":"3
|
72
|
+
of 6","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/53148","name":"1
|
73
|
+
of 1","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/53543","name":"1
|
74
|
+
of 2","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/57228","name":"Interior
|
75
|
+
#57228","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/57230","name":"Interior
|
76
|
+
#57230","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/57232","name":"Interior
|
77
|
+
#57232","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/57234","name":"Interior
|
78
|
+
#57234","type":"interiorStory"},{"resourceURI":"http://gateway.marvel.com/v1/public/stories/57236","name":"Interior
|
79
|
+
#57236","type":"interiorStory"}],"returned":20},"events":{"available":6,"collectionURI":"http://gateway.marvel.com/v1/public/characters/1009521/events","items":[{"resourceURI":"http://gateway.marvel.com/v1/public/events/318","name":"Dark
|
80
|
+
Reign"},{"resourceURI":"http://gateway.marvel.com/v1/public/events/302","name":"Fear
|
81
|
+
Itself"},{"resourceURI":"http://gateway.marvel.com/v1/public/events/255","name":"Initiative"},{"resourceURI":"http://gateway.marvel.com/v1/public/events/269","name":"Secret
|
82
|
+
Invasion"},{"resourceURI":"http://gateway.marvel.com/v1/public/events/309","name":"Shattered
|
83
|
+
Heroes"},{"resourceURI":"http://gateway.marvel.com/v1/public/events/273","name":"Siege"}],"returned":6},"urls":[{"type":"detail","url":"http://marvel.com/comics/characters/1009521/_hank_pym?utm_campaign=apiRef&utm_source=07e4dc912806b1c5d1e51687095bca09"}]}]}}'
|
84
|
+
http_version:
|
85
|
+
recorded_at: Sun, 09 Feb 2014 05:45:28 GMT
|
86
|
+
recorded_with: VCR 2.8.0
|