marver 0.0.0 → 0.0.2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +13 -0
  5. data/LICENSE +20 -0
  6. data/README.md +32 -0
  7. data/Rakefile +1 -0
  8. data/lib/marver.rb +35 -21
  9. data/lib/marver/builders/common_entities_builder.rb +46 -0
  10. data/lib/marver/builders/core_entities_builder.rb +34 -0
  11. data/lib/marver/client.rb +13 -0
  12. data/lib/marver/credentials.rb +23 -0
  13. data/lib/marver/data_container.rb +18 -0
  14. data/lib/marver/entities/common/image.rb +9 -0
  15. data/lib/marver/entities/common/key_date.rb +10 -0
  16. data/lib/marver/entities/common/price.rb +10 -0
  17. data/lib/marver/entities/common/text_object.rb +11 -0
  18. data/lib/marver/entities/common/url.rb +10 -0
  19. data/lib/marver/entities/core/character.rb +35 -0
  20. data/lib/marver/entities/core/comic.rb +46 -0
  21. data/lib/marver/entities/core/creator.rb +36 -0
  22. data/lib/marver/entities/core/event.rb +35 -0
  23. data/lib/marver/entities/core/serie.rb +37 -0
  24. data/lib/marver/entities/core/story.rb +36 -0
  25. data/lib/marver/entities/summaries/character_summary.rb +22 -0
  26. data/lib/marver/entities/summaries/comic_summary.rb +20 -0
  27. data/lib/marver/entities/summaries/creator_summary.rb +12 -0
  28. data/lib/marver/entities/summaries/event_summary.rb +14 -0
  29. data/lib/marver/entities/summaries/serie_summary.rb +13 -0
  30. data/lib/marver/entities/summaries/story_summary.rb +14 -0
  31. data/lib/marver/finders/character_finder.rb +24 -0
  32. data/lib/marver/helpers/string_helper.rb +36 -0
  33. data/lib/marver/rest/client.rb +22 -0
  34. data/lib/marver/rest/error.rb +13 -0
  35. data/lib/marver/rest/response.rb +18 -0
  36. data/lib/marver/version.rb +3 -0
  37. data/marver.gemspec +23 -0
  38. data/spec/fixtures/character.json +398 -0
  39. data/spec/fixtures/comic.json +243 -0
  40. data/spec/fixtures/creator.json +345 -0
  41. data/spec/fixtures/event.json +104 -0
  42. data/spec/fixtures/raw_json.json +398 -0
  43. data/spec/fixtures/serie.json +102 -0
  44. data/spec/fixtures/story.json +94 -0
  45. data/spec/marver/client_spec.rb +12 -0
  46. data/spec/marver/credentials_spec.rb +19 -0
  47. data/spec/marver/data_container_spec.rb +23 -0
  48. data/spec/marver/entities/core/character_spec.rb +76 -0
  49. data/spec/marver/entities/core/comic_spec.rb +150 -0
  50. data/spec/marver/entities/core/creator_spec.rb +83 -0
  51. data/spec/marver/entities/core/event_spec.rb +106 -0
  52. data/spec/marver/entities/core/serie_spec.rb +106 -0
  53. data/spec/marver/entities/core/story_spec.rb +70 -0
  54. data/spec/marver/entities/image_spec.rb +9 -0
  55. data/spec/marver/entities/key_date_spec.rb +17 -0
  56. data/spec/marver/entities/price_spec.rb +13 -0
  57. data/spec/marver/entities/summaries/character_summary_spec.rb +65 -0
  58. data/spec/marver/entities/summaries/comic_summary_spec.rb +64 -0
  59. data/spec/marver/entities/summaries/creator_summary_spec.rb +23 -0
  60. data/spec/marver/entities/summaries/event_summary_spec.rb +30 -0
  61. data/spec/marver/entities/summaries/serie_summary_spec.rb +26 -0
  62. data/spec/marver/entities/summaries/story_summary_spec.rb +30 -0
  63. data/spec/marver/entities/text_object_spec.rb +20 -0
  64. data/spec/marver/entities/url_spec.rb +16 -0
  65. data/spec/marver/finders/character_finder_spec.rb +27 -0
  66. data/spec/marver/rest/client_spec.rb +10 -0
  67. data/spec/marver/rest/error_spec.rb +14 -0
  68. data/spec/marver/rest/response_spec.rb +22 -0
  69. data/spec/spec_helper.rb +17 -0
  70. metadata +137 -8
@@ -0,0 +1,36 @@
1
+ module Marver
2
+ class Creator
3
+ attr_reader :id, :first_name, :middle_name, :last_name, :full_name,
4
+ :suffix, :resource_uri, :json, :credentials
5
+
6
+ class << self
7
+ def build(response, credentials)
8
+ if response.kind_of?(Array)
9
+ response.collect do |creator|
10
+ Marver::Creator.new(creator, credentials)
11
+ end
12
+ else
13
+ new(response.results, credentials)
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize(json, credentials)
19
+ @json = json
20
+ @credentials = credentials
21
+
22
+ @id = @json['id']
23
+ @first_name = @json['firstName']
24
+ @middle_name = @json['middleName']
25
+ @last_name = @json['lastName']
26
+ @full_name = @json['fullName']
27
+ @suffix = @json['suffix']
28
+
29
+ @resource_uri = @json['resourceURI']
30
+
31
+ CommonEntitiesBuilder.build!(self)
32
+ CoreEntitiesBuilder.build!(self)
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ module Marver
2
+ class Event
3
+ attr_reader :json, :credentials, :title, :resource_uri,
4
+ :description, :start, :end, :next, :previous
5
+
6
+ class << self
7
+ def build(response, credentials)
8
+ if response.kind_of?(Array)
9
+ response.collect do |event|
10
+ Marver::Event.new(event, credentials)
11
+ end
12
+ else
13
+ new(response.results, credentials)
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize(json, credentials)
19
+ @credentials = credentials
20
+ @json = json
21
+
22
+ @title = @json['title']
23
+ @resource_uri = "#{@json['resourceURI']}?#{@credentials.to_s}"
24
+
25
+ @description = @json['description']
26
+ @start = Date.parse(@json['start'])
27
+ @end = Date.parse(@json['end'])
28
+ @next = Marver::EventSummary.new(@json['next'], @credentials)
29
+ @previous = Marver::EventSummary.new(@json['previous'], @credentials)
30
+
31
+ CommonEntitiesBuilder.build!(self)
32
+ CoreEntitiesBuilder.build!(self)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ module Marver
2
+ class Serie
3
+ attr_reader :json, :credentials, :id, :title, :resource_uri, :description,
4
+ :start_year, :end_year, :rating, :next, :previous
5
+
6
+ class << self
7
+ def build(response, credentials)
8
+ if response.kind_of?(Array)
9
+ response.collect do |serie|
10
+ Marver::Serie.new(serie, credentials)
11
+ end
12
+ else
13
+ new(response.results, credentials)
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize(json, credentials)
19
+ @json = json
20
+ @credentials = credentials
21
+
22
+ @id = @json['id']
23
+ @title = @json['title']
24
+ @resource_uri = @json['resourceURI']
25
+ @description = @json['description']
26
+ @start_year = @json['startYear']
27
+ @end_year = @json['endYear']
28
+ @rating = @json['rating']
29
+
30
+ @next = Marver::SerieSummary.new(@json['next'], @credentials)
31
+ @previous = Marver::SerieSummary.new(@json['previous'], @credentials)
32
+
33
+ CommonEntitiesBuilder.build!(self)
34
+ CoreEntitiesBuilder.build!(self)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class Story
5
+ attr_reader :id, :json, :title, :type, :resource_uri, :description, :thumbnail,
6
+ :comics, :series, :events, :characters, :creators, :original_issue,
7
+ :credentials
8
+
9
+ class << self
10
+ def build(response, credentials)
11
+ if response.kind_of?(Array)
12
+ response.collect do |story|
13
+ Marver::Story.new(story, credentials)
14
+ end
15
+ else
16
+ new(response.results, credentials)
17
+ end
18
+ end
19
+ end
20
+
21
+ def initialize(json, credentials)
22
+ @credentials = credentials
23
+ @json = json
24
+
25
+ @title = @json['title']
26
+ @type = @json['type']
27
+ @resource_uri = "#{@json['resourceURI']}?#{@credentials.to_s}"
28
+ @description = @json['description']
29
+
30
+ @original_issue = Marver::ComicSummary.new(@json['originalIssue'], @credentials)
31
+
32
+ CoreEntitiesBuilder.build!(self)
33
+ CommonEntitiesBuilder.build!(self)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,22 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class CharacterSummary
5
+ attr_reader :id, :name, :resource_uri, :type
6
+
7
+ def initialize(json, credentials)
8
+ @id = json['id'].to_i
9
+ @credentials = credentials
10
+ @name = json['name']
11
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
12
+ @type = json['type'] || nil
13
+ end
14
+
15
+ def full
16
+ response = Marver::REST::Response.new(RestClient.get(@resource_uri))
17
+ data = Marver::DataContainer.new(response)
18
+ Marver::Character.build(data, @credentials)
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class ComicSummary
5
+ attr_reader :id, :name, :resource_uri, :type
6
+
7
+ def initialize(json, credentials)
8
+ @credentials = credentials
9
+ @name = json['name']
10
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
11
+ @id = json['id'].to_i
12
+ end
13
+
14
+ def full
15
+ response = Marver::REST::Response.new(RestClient.get(@resource_uri))
16
+ data = Marver::DataContainer.new(response)
17
+ Marver::Comic.build(data, @credentials)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Marver
2
+ class CreatorSummary
3
+ attr_reader :name, :resource_uri, :role
4
+
5
+ def initialize(json, credentials)
6
+ @credentials = credentials
7
+ @name = json['name']
8
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
9
+ @role = json['role']
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Marver
2
+ class EventSummary
3
+ attr_reader :id, :name, :resource_uri, :type
4
+
5
+ def initialize(json, credentials)
6
+ @id = json['id'].to_i
7
+ @credentials = credentials
8
+ @name = json['name']
9
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
10
+ @type = json['type'] || nil
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module Marver
2
+ class SerieSummary
3
+ attr_reader :id, :name, :resource_uri, :type
4
+
5
+ def initialize(json, credentials)
6
+ @credentials = credentials
7
+
8
+ @name = json['name']
9
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Marver
2
+ class StorySummary
3
+ attr_reader :id, :name, :resource_uri, :type
4
+
5
+ def initialize(json, credentials)
6
+ @credentials = credentials
7
+ @name = json['name']
8
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
9
+ @type = json['type'] || nil
10
+ @id = json['id'].to_i
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class CharacterFinder
5
+ attr_reader :credentials, :rest_client
6
+
7
+ def initialize(credentials)
8
+ @credentials = credentials
9
+ @rest_client = Marver::REST::Client.new
10
+ end
11
+
12
+ def find(options = {})
13
+ response = @rest_client.get_request(url)
14
+ results = Marver::DataContainer.new(response).results
15
+ Marver::Character.build(results, @credentials)
16
+ end
17
+
18
+ private
19
+
20
+ def url
21
+ "characters?#{@credentials.to_s}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ module Marver
2
+ module StringHelper
3
+ def summary_class(entity)
4
+ constantize("Marver::#{refined(entity)}Summary")
5
+ end
6
+
7
+ def common_class(entity)
8
+ constantize("Marver::#{refined(entity)}")
9
+ end
10
+
11
+ def parameterize(entity)
12
+ entity.split(/(?=[A-Z])/).join('_').downcase
13
+ end
14
+
15
+ def refined(name)
16
+ return "Comic" if name == 'originalIssue'
17
+ return 'TextObject' if name == 'textObjects'
18
+ return "KeyDate" if name == 'dates'
19
+ return "Image" if name == 'thumbnail'
20
+ return "Story" if name == 'stories'
21
+ return name[0..-2].capitalize
22
+ end
23
+
24
+ def constantize(camel_cased_word)
25
+ names = camel_cased_word.split('::')
26
+ names.shift if names.empty? || names.first.empty?
27
+
28
+ constant = Object
29
+ names.each do |name|
30
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
31
+ end
32
+ constant
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,22 @@
1
+ require 'rest_client'
2
+ require 'digest/md5'
3
+ require_relative 'response'
4
+
5
+ module Marver
6
+ module REST
7
+ class Client
8
+ API_VERSION = "v1"
9
+ API_ENDPOINT = "http://gateway.marvel.com"
10
+
11
+ def get_request(query_string)
12
+ url = endpoint + query_string
13
+ Marver::REST::Response.new(RestClient.get(url))
14
+ end
15
+
16
+ def endpoint
17
+ "#{API_ENDPOINT}/#{API_VERSION}/public/"
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ module Marver
2
+ module REST
3
+ class Error
4
+ attr_reader :code, :status
5
+
6
+ def initialize(json)
7
+ @code = json['code'].to_i
8
+ @status = json['status']
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require 'json'
2
+ require './lib/marver.rb'
3
+
4
+ module Marver
5
+ module REST
6
+ class Response
7
+ attr_reader :code, :status, :data, :results
8
+
9
+ def initialize(raw_json)
10
+ json = JSON.parse(raw_json)
11
+ @code = json['code'].to_i
12
+ @status = json['status']
13
+ @data = json['data']
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Marver
2
+ VERSION = '0.0.2'
3
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'marver/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "marver"
8
+ spec.version = Marver::VERSION
9
+ spec.authors = ["Ile Eftimov"]
10
+ spec.email = ["ileeftimov@gmail.com"]
11
+ spec.summary = %q{Marver, Marvel's API gem}
12
+ spec.description = %q{Marver, Marvel's API gem}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,398 @@
1
+ {
2
+ "code": 200,
3
+ "status": "Ok",
4
+ "etag": "ec5ab621cf3760eb6f2df2e6270ccb56c6debfb7",
5
+ "data": {
6
+ "offset": 0,
7
+ "limit": 20,
8
+ "total": 1,
9
+ "count": 1,
10
+ "results": [
11
+ {
12
+ "id": 1009220,
13
+ "name": "Captain America",
14
+ "description": "Vowing to serve his country any way he could, young Steve Rogers took the super soldier serum to become America's one-man army. Fighting for the red, white and blue for over 60 years, Captain America is the living, breathing symbol of freedom and liberty.",
15
+ "modified": "2013-10-18T17:32:09-0400",
16
+ "thumbnail": {
17
+ "path": "http://i.annihil.us/u/prod/marvel/i/mg/2/c0/5261a81d0154e",
18
+ "extension": "jpg"
19
+ },
20
+ "resourceURI": "http://gateway.marvel.com/v1/public/characters/1009220",
21
+ "comics": {
22
+ "available": 1423,
23
+ "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009220/comics",
24
+ "items": [
25
+ {
26
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/42539",
27
+ "name": "Age of Apocalypse (2011) #2 (Avengers Art Appreciation Variant)"
28
+ },
29
+ {
30
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/30885",
31
+ "name": "Age of Heroes (Trade Paperback)"
32
+ },
33
+ {
34
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/38524",
35
+ "name": "Age of X: Universe (2011) #1"
36
+ },
37
+ {
38
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12555",
39
+ "name": "All-Winners Comics (1941) #1"
40
+ },
41
+ {
42
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12566",
43
+ "name": "All-Winners Comics (1941) #2"
44
+ },
45
+ {
46
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12568",
47
+ "name": "All-Winners Comics (1941) #3"
48
+ },
49
+ {
50
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12569",
51
+ "name": "All-Winners Comics (1941) #4"
52
+ },
53
+ {
54
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12570",
55
+ "name": "All-Winners Comics (1941) #5"
56
+ },
57
+ {
58
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12571",
59
+ "name": "All-Winners Comics (1941) #6"
60
+ },
61
+ {
62
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12572",
63
+ "name": "All-Winners Comics (1941) #7"
64
+ },
65
+ {
66
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12573",
67
+ "name": "All-Winners Comics (1941) #8"
68
+ },
69
+ {
70
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12574",
71
+ "name": "All-Winners Comics (1941) #9"
72
+ },
73
+ {
74
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12556",
75
+ "name": "All-Winners Comics (1941) #10"
76
+ },
77
+ {
78
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12557",
79
+ "name": "All-Winners Comics (1941) #11"
80
+ },
81
+ {
82
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12558",
83
+ "name": "All-Winners Comics (1941) #12"
84
+ },
85
+ {
86
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12559",
87
+ "name": "All-Winners Comics (1941) #13"
88
+ },
89
+ {
90
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12560",
91
+ "name": "All-Winners Comics (1941) #14"
92
+ },
93
+ {
94
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12561",
95
+ "name": "All-Winners Comics (1941) #15"
96
+ },
97
+ {
98
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12562",
99
+ "name": "All-Winners Comics (1941) #16"
100
+ },
101
+ {
102
+ "resourceURI": "http://gateway.marvel.com/v1/public/comics/12563",
103
+ "name": "All-Winners Comics (1941) #17"
104
+ }
105
+ ],
106
+ "returned": 20
107
+ },
108
+ "series": {
109
+ "available": 376,
110
+ "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009220/series",
111
+ "items": [
112
+ {
113
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/15331",
114
+ "name": "Age of Apocalypse (2011 - Present)"
115
+ },
116
+ {
117
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/10235",
118
+ "name": "Age of Heroes (2011)"
119
+ },
120
+ {
121
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/13896",
122
+ "name": "Age of X: Universe (2011)"
123
+ },
124
+ {
125
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/2114",
126
+ "name": "All-Winners Comics (1941 - 1947)"
127
+ },
128
+ {
129
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/9865",
130
+ "name": "All-Winners Squad: Band of Heroes (2011)"
131
+ },
132
+ {
133
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/2116",
134
+ "name": "Alpha Flight (1983 - 1994)"
135
+ },
136
+ {
137
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/1983",
138
+ "name": "Alpha Flight Classic Vol. 1 (2007)"
139
+ },
140
+ {
141
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/454",
142
+ "name": "Amazing Spider-Man (1999 - 2013)"
143
+ },
144
+ {
145
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/1987",
146
+ "name": "Amazing Spider-Man (1963 - 1998)"
147
+ },
148
+ {
149
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/2984",
150
+ "name": "Amazing Spider-Man Annual (1964 - Present)"
151
+ },
152
+ {
153
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/14818",
154
+ "name": "Annihilators: Earthfall (2011)"
155
+ },
156
+ {
157
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/14696",
158
+ "name": "Art of Marvel Movies: The Art of Captain America - The First Avenger (2011 - Present)"
159
+ },
160
+ {
161
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/14779",
162
+ "name": "Art of Marvel Studios TPB Slipcase (2011 - Present)"
163
+ },
164
+ {
165
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/9381",
166
+ "name": "Astonishing X-Men Vol. 6: Xenogenetic (2010)"
167
+ },
168
+ {
169
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/9085",
170
+ "name": "Avengers (2010 - 2012)"
171
+ },
172
+ {
173
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/3621",
174
+ "name": "Avengers (1996 - 1997)"
175
+ },
176
+ {
177
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/354",
178
+ "name": "Avengers (1998 - 2004)"
179
+ },
180
+ {
181
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/1991",
182
+ "name": "Avengers (1963 - 1996)"
183
+ },
184
+ {
185
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/9086",
186
+ "name": "Avengers Academy (2010 - 2012)"
187
+ },
188
+ {
189
+ "resourceURI": "http://gateway.marvel.com/v1/public/series/1988",
190
+ "name": "Avengers Annual (1967 - 1994)"
191
+ }
192
+ ],
193
+ "returned": 20
194
+ },
195
+ "stories": {
196
+ "available": 2285,
197
+ "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009220/stories",
198
+ "items": [
199
+ {
200
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/892",
201
+ "name": "Cover #892",
202
+ "type": "cover"
203
+ },
204
+ {
205
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/960",
206
+ "name": "3 of ?",
207
+ "type": "cover"
208
+ },
209
+ {
210
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/1041",
211
+ "name": "Avengers (1998) #502",
212
+ "type": "interiorStory"
213
+ },
214
+ {
215
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/1042",
216
+ "name": "Avengers (1998) #503",
217
+ "type": "cover"
218
+ },
219
+ {
220
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/1675",
221
+ "name": "Cover #1675",
222
+ "type": "cover"
223
+ },
224
+ {
225
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/2353",
226
+ "name": "1 of 5 -",
227
+ "type": "cover"
228
+ },
229
+ {
230
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/2875",
231
+ "name": "2 of 5 - Brothers and Keepers",
232
+ "type": "cover"
233
+ },
234
+ {
235
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3435",
236
+ "name": "New Avengers (2004) #1",
237
+ "type": "cover"
238
+ },
239
+ {
240
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3436",
241
+ "name": "New Avengers (2004) #1",
242
+ "type": "interiorStory"
243
+ },
244
+ {
245
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3437",
246
+ "name": "2 of 5 - The Raft",
247
+ "type": "cover"
248
+ },
249
+ {
250
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3439",
251
+ "name": "Cover #3439",
252
+ "type": "cover"
253
+ },
254
+ {
255
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3443",
256
+ "name": "4 of 5 - Breakout!",
257
+ "type": "cover"
258
+ },
259
+ {
260
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3445",
261
+ "name": "5 of 6 - Breakout!",
262
+ "type": "cover"
263
+ },
264
+ {
265
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3455",
266
+ "name": "6 of 6 - Breakout!",
267
+ "type": "cover"
268
+ },
269
+ {
270
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3457",
271
+ "name": "1 of 5 - The Raft",
272
+ "type": "cover"
273
+ },
274
+ {
275
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3459",
276
+ "name": "1 of 3 - Sentry",
277
+ "type": "cover"
278
+ },
279
+ {
280
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3461",
281
+ "name": "Cover #3461",
282
+ "type": "cover"
283
+ },
284
+ {
285
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3463",
286
+ "name": "3 of 3 - Sentry",
287
+ "type": "cover"
288
+ },
289
+ {
290
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3465",
291
+ "name": "1 of 3 - Ronin",
292
+ "type": "cover"
293
+ },
294
+ {
295
+ "resourceURI": "http://gateway.marvel.com/v1/public/stories/3467",
296
+ "name": "2 of 3 - Ronin",
297
+ "type": "cover"
298
+ }
299
+ ],
300
+ "returned": 20
301
+ },
302
+ "events": {
303
+ "available": 19,
304
+ "collectionURI": "http://gateway.marvel.com/v1/public/characters/1009220/events",
305
+ "items": [
306
+ {
307
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/116",
308
+ "name": "Acts of Vengeance!"
309
+ },
310
+ {
311
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/303",
312
+ "name": "Age of X"
313
+ },
314
+ {
315
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/231",
316
+ "name": "Armor Wars"
317
+ },
318
+ {
319
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/234",
320
+ "name": "Avengers Disassembled"
321
+ },
322
+ {
323
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/310",
324
+ "name": "Avengers VS X-Men"
325
+ },
326
+ {
327
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/296",
328
+ "name": "Chaos War"
329
+ },
330
+ {
331
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/238",
332
+ "name": "Civil War"
333
+ },
334
+ {
335
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/248",
336
+ "name": "Fall of the Mutants"
337
+ },
338
+ {
339
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/302",
340
+ "name": "Fear Itself"
341
+ },
342
+ {
343
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/251",
344
+ "name": "House of M"
345
+ },
346
+ {
347
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/253",
348
+ "name": "Infinity Gauntlet"
349
+ },
350
+ {
351
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/29",
352
+ "name": "Infinity War"
353
+ },
354
+ {
355
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/37",
356
+ "name": "Maximum Security"
357
+ },
358
+ {
359
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/154",
360
+ "name": "Onslaught"
361
+ },
362
+ {
363
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/269",
364
+ "name": "Secret Invasion"
365
+ },
366
+ {
367
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/270",
368
+ "name": "Secret Wars"
369
+ },
370
+ {
371
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/271",
372
+ "name": "Secret Wars II"
373
+ },
374
+ {
375
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/309",
376
+ "name": "Shattered Heroes"
377
+ },
378
+ {
379
+ "resourceURI": "http://gateway.marvel.com/v1/public/events/273",
380
+ "name": "Siege"
381
+ }
382
+ ],
383
+ "returned": 19
384
+ },
385
+ "urls": [
386
+ {
387
+ "type": "detail",
388
+ "url": "http://marvel.com/comics/characters/1009220/captain_america?utm_campaign=apiRef&utm_source=f302f582215c3deedff86e8015f853c7"
389
+ },
390
+ {
391
+ "type": "wiki",
392
+ "url": "http://marvel.com/universe/Captain_America_(Steve_Rogers)?utm_campaign=apiRef&utm_source=f302f582215c3deedff86e8015f853c7"
393
+ }
394
+ ]
395
+ }
396
+ ]
397
+ }
398
+ }