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 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
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "minitest"
4
+ gem "vcr"
5
+ gem "webmock"
6
+ gem "httparty"
7
+ gem "pry"
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "rake/testtask"
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.pattern = "spec/lib/*_spec.rb"
5
+ end
@@ -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
@@ -0,0 +1,7 @@
1
+ module Marvell
2
+ class JsonParser
3
+ def self.parse_result_set(json)
4
+ json.fetch("data").fetch("results")
5
+ end
6
+ end
7
+ end
data/lib/marvell.rb ADDED
@@ -0,0 +1,3 @@
1
+ Dir[File.dirname(__FILE__) + '/marvell/*.rb'].each do |file|
2
+ require file
3
+ end
@@ -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