marvelite 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +83 -0
- data/lib/marvelite.rb +3 -2
- data/lib/marvelite/api/character_methods.rb +14 -6
- data/lib/marvelite/api/client.rb +2 -9
- data/lib/marvelite/api/comic_methods.rb +6 -6
- data/lib/marvelite/api/config/v1.yml +57 -0
- data/lib/marvelite/api/event_methods.rb +80 -0
- data/lib/marvelite/api/router.rb +30 -35
- data/lib/marvelite/version.rb +1 -1
- data/spec/fixtures/events/event.json +519 -0
- data/spec/fixtures/events/event_characters.json +6582 -0
- data/spec/fixtures/events/event_comics.json +3420 -0
- data/spec/fixtures/events/event_creators.json +6330 -0
- data/spec/fixtures/events/event_series.json +8438 -0
- data/spec/fixtures/events/event_stories.json +1899 -0
- data/spec/fixtures/events/events.json +8606 -0
- data/spec/marvelite/api/client_events_endpoints_spec.rb +159 -0
- data/spec/marvelite/api/client_spec.rb +2 -2
- data/spec/marvelite/api/router_spec.rb +26 -1
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 984423d6566dfc1729975c08cda31745a35afe55
|
4
|
+
data.tar.gz: 4ad394d4c98726d62f5e465e5e7bd7898390febb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32bb4d940672d707a0ddb92ba322fafc3b6fa93796b8f7ee3bbe5f58657e3bf7572d6d425cd77a24913f939c82a9ea123f2e9778981132d4ca12b0bf22168a1d
|
7
|
+
data.tar.gz: 90af92a8e7c9fd53aead7ec8c3eb8c34db2d1e2755afbce35ed5bfbb636da59e54c790deba64f259e5381d32f113b960d1c363e6c45792f783049e8c28eec5f4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### 0.0.5
|
4
|
+
* Rewrites `Marvelite::API::Router` class to make flexible to future API versioning changes from Marvel.
|
5
|
+
* Adds the following endpoints:
|
6
|
+
* retrieve events by connecting to the API's `/events` endpoint
|
7
|
+
* retieve a event by connecting to the API's `/events/:id` enpoint
|
8
|
+
* retrieve event characters by connecting to the API's `/events/:id/characters` endpoint.
|
9
|
+
* retrieve event comics by connecting to the API's `/events/:id/comics` endpoint.
|
10
|
+
* retrieve event creators by connecting to the API's `/events/:id/creators` endpoint.
|
11
|
+
* retrieve event series by connecting to the API's `/events/:id/series` endpoint.
|
12
|
+
* retrieve event stories by connecting to the API's `/events/:id/stories` endpoint.
|
13
|
+
* Adds helper method to retrieve event sub-resources passing an event name instead of a numeric id.
|
14
|
+
|
15
|
+
|
3
16
|
### 0.0.4
|
4
17
|
* Adds the following endpoints:
|
5
18
|
* retrieve comics by connecting to the API's `/comics` endpoint
|
data/README.md
CHANGED
@@ -55,6 +55,13 @@ client = Marvelite::API::Client.new(
|
|
55
55
|
| [#comic_creators](#comic_creators) | Fetches a list of comic creators whose work appears in a specific comic. |
|
56
56
|
| [#comic_events](#comic_events) | Fetches a list of events in which a comic appears. |
|
57
57
|
| [#comic_stories](#comic_stories) | Fetches a list of comic stories in a specific comic issue. |
|
58
|
+
| [#events](#events) | Fetches a list of events. |
|
59
|
+
| [#event](#event) | Fetches a single event resource. |
|
60
|
+
| [#event_characters](#event_characters) | Fetches a list of characters which appear in a specific event. |
|
61
|
+
| [#event_comics](#event_comics) | Fetches a list of comics which take place during a specific event. |
|
62
|
+
| [#event_creators](#event_creators) | Fetches a list of event creators whose work appears in a specific event. |
|
63
|
+
| [#event_series](#event_series) | Fetches a list of comic series in which a specific event takes place. |
|
64
|
+
| [#event_stories](#event_stories) | Fetches a list of comic stories from a specific event. |
|
58
65
|
|
59
66
|
|
60
67
|
#### characters
|
@@ -213,6 +220,82 @@ client.comic_stories(40128, :orderBy => 'name', :limit => 10)
|
|
213
220
|
|
214
221
|
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getComicStoryCollection_get_11) for a complete list of params that you can pass to the `#comic_stories` method.
|
215
222
|
|
223
|
+
#### events
|
224
|
+
|
225
|
+
Fetches a list of events. Accepts optional params.
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
client.events
|
229
|
+
client.events(:name => 'Acts of Vengeance')
|
230
|
+
client.events(:orderBy => 'name')
|
231
|
+
```
|
232
|
+
|
233
|
+
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getEventsCollection_get_18) for a complete list of params that you can pass to the `#events` method.
|
234
|
+
|
235
|
+
#### event
|
236
|
+
|
237
|
+
Fetches a single comic resource. Requires an event id value (integer).
|
238
|
+
|
239
|
+
```ruby
|
240
|
+
client.event(116)
|
241
|
+
```
|
242
|
+
|
243
|
+
#### event_characters
|
244
|
+
|
245
|
+
Fetches a list of characters which appear in a specific event. Requires an event id value (integer). Accepts optional params.
|
246
|
+
|
247
|
+
```ruby
|
248
|
+
client.event_characters(116)
|
249
|
+
client.event_characters(116, :orderBy => 'name', :limit => 30, :offset => 20)
|
250
|
+
```
|
251
|
+
|
252
|
+
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getEventCharacterCollection_get_20) for a complete list of params that you can pass to the `#event_characters` method.
|
253
|
+
|
254
|
+
#### event_creators
|
255
|
+
|
256
|
+
Fetches a list of comic creators whose work appears in a specific event. Requires an event id value (integer). Accepts optional params.
|
257
|
+
|
258
|
+
```ruby
|
259
|
+
client.event_creators(116)
|
260
|
+
client.event_creators(116, :lastName => 'Romita')
|
261
|
+
```
|
262
|
+
|
263
|
+
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getCreatorCollection_get_22) for a complete list of params that you can pass to the `#event_creators` method.
|
264
|
+
|
265
|
+
#### event_comics
|
266
|
+
|
267
|
+
Fetches a list of comics which take place during a specific event. Requires an event id value (integer). Accepts optional params.
|
268
|
+
|
269
|
+
```ruby
|
270
|
+
client.event_comics(116)
|
271
|
+
client.event_comics(116, :format => 'graphic novel', :orderBy => 'title', :limit => 10)
|
272
|
+
```
|
273
|
+
|
274
|
+
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getComicsCollection_get_21) for a complete list of params that you can pass to the `#event_comics` method.
|
275
|
+
|
276
|
+
#### event_series
|
277
|
+
|
278
|
+
Fetches a list of comic series in which a specific event takes place. Requires an event id value (integer). Accepts optional params.
|
279
|
+
|
280
|
+
```ruby
|
281
|
+
client.event_series(116)
|
282
|
+
client.event_series(116, :orderBy => 'title', :limit => 10)
|
283
|
+
```
|
284
|
+
|
285
|
+
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getCreatorSeriesCollection_get_23) for a complete list of params that you can pass to the `#event_series` method.
|
286
|
+
|
287
|
+
#### event_stories
|
288
|
+
|
289
|
+
Fetches a list of comic stories from a specific event. Requires an event id value (integer). Accepts optional params.
|
290
|
+
|
291
|
+
```ruby
|
292
|
+
client.event_stories(116)
|
293
|
+
client.event_stories(116, :limit => 10)
|
294
|
+
```
|
295
|
+
|
296
|
+
See the [Marvel Comics Interactive API Tester](http://developer.marvel.com/docs#!/public/getEventStoryCollection_get_24) for a complete list of params that you can pass to the `#event_stories` method.
|
297
|
+
|
298
|
+
|
216
299
|
|
217
300
|
## Responses
|
218
301
|
|
data/lib/marvelite.rb
CHANGED
@@ -7,11 +7,12 @@ require "marvelite/version"
|
|
7
7
|
require "marvelite/api/router"
|
8
8
|
require "marvelite/api/character_methods"
|
9
9
|
require "marvelite/api/comic_methods"
|
10
|
+
require "marvelite/api/event_methods"
|
10
11
|
require "marvelite/api/client"
|
11
12
|
require "marvelite/api/response"
|
12
13
|
|
13
14
|
module Marvelite
|
14
|
-
def self.router
|
15
|
-
Marvelite::API::Router.new
|
15
|
+
def self.router(attrs = {})
|
16
|
+
Marvelite::API::Router.new(attrs)
|
16
17
|
end
|
17
18
|
end
|
@@ -2,7 +2,7 @@ module Marvelite
|
|
2
2
|
module API
|
3
3
|
module CharacterMethods
|
4
4
|
def characters(query_params = {})
|
5
|
-
response = self.class.get(
|
5
|
+
response = self.class.get(router.characters_path, :query => params(query_params))
|
6
6
|
build_response_object(response)
|
7
7
|
end
|
8
8
|
|
@@ -11,7 +11,7 @@ module Marvelite
|
|
11
11
|
response = if by_name
|
12
12
|
find_character_by_name(value)
|
13
13
|
else
|
14
|
-
self.class.get(
|
14
|
+
self.class.get(router.character_path(:id => value), :query => params)
|
15
15
|
end
|
16
16
|
|
17
17
|
build_response_object(response)
|
@@ -24,7 +24,7 @@ module Marvelite
|
|
24
24
|
id = character.id
|
25
25
|
end
|
26
26
|
|
27
|
-
response = self.class.get(
|
27
|
+
response = self.class.get(router.character_comics_path(:id => id), :query => params(query_params))
|
28
28
|
build_response_object(response)
|
29
29
|
end
|
30
30
|
|
@@ -34,7 +34,7 @@ module Marvelite
|
|
34
34
|
return false unless character
|
35
35
|
id = character.id
|
36
36
|
end
|
37
|
-
response = self.class.get(
|
37
|
+
response = self.class.get(router.character_events_path(:id => id), :query => params(query_params))
|
38
38
|
build_response_object(response)
|
39
39
|
end
|
40
40
|
|
@@ -44,7 +44,7 @@ module Marvelite
|
|
44
44
|
return false unless character
|
45
45
|
id = character.id
|
46
46
|
end
|
47
|
-
response = self.class.get(
|
47
|
+
response = self.class.get(router.character_series_path(:id => id), :query => params(query_params))
|
48
48
|
build_response_object(response)
|
49
49
|
end
|
50
50
|
|
@@ -54,9 +54,17 @@ module Marvelite
|
|
54
54
|
return false unless character
|
55
55
|
id = character.id
|
56
56
|
end
|
57
|
-
response = self.class.get(
|
57
|
+
response = self.class.get(router.character_stories_path(:id => id), :query => params(query_params))
|
58
58
|
build_response_object(response)
|
59
59
|
end
|
60
|
+
|
61
|
+
def find_character_by_name(name)
|
62
|
+
response = self.characters(:name => name)
|
63
|
+
return false unless response[:data][:results].size > 0
|
64
|
+
|
65
|
+
response.id = response[:data][:results][0][:id]
|
66
|
+
response
|
67
|
+
end
|
60
68
|
end
|
61
69
|
end
|
62
70
|
end
|
data/lib/marvelite/api/client.rb
CHANGED
@@ -5,6 +5,7 @@ module Marvelite
|
|
5
5
|
|
6
6
|
include Marvelite::API::CharacterMethods
|
7
7
|
include Marvelite::API::ComicMethods
|
8
|
+
include Marvelite::API::EventMethods
|
8
9
|
|
9
10
|
include HTTParty
|
10
11
|
base_uri 'http://gateway.marvel.com'
|
@@ -16,8 +17,8 @@ module Marvelite
|
|
16
17
|
|
17
18
|
def initialize(attrs)
|
18
19
|
super
|
19
|
-
@router = attrs.fetch(:router) { Marvelite.router }
|
20
20
|
@api_version = attrs.fetch(:api_version) { 'v1' }
|
21
|
+
@router = attrs.fetch(:router) { Marvelite.router(:api_version => @api_version) }
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
@@ -36,14 +37,6 @@ module Marvelite
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
39
|
-
def find_character_by_name(name)
|
40
|
-
response = self.characters(:name => name)
|
41
|
-
return false unless response[:data][:results].size > 0
|
42
|
-
|
43
|
-
response.id = response[:data][:results][0][:id]
|
44
|
-
response
|
45
|
-
end
|
46
|
-
|
47
40
|
def build_response_object(response)
|
48
41
|
case response["code"]
|
49
42
|
when 200
|
@@ -2,32 +2,32 @@ module Marvelite
|
|
2
2
|
module API
|
3
3
|
module ComicMethods
|
4
4
|
def comics(query_params = {})
|
5
|
-
response = self.class.get(
|
5
|
+
response = self.class.get(router.comics_path, :query => params(query_params))
|
6
6
|
build_response_object(response)
|
7
7
|
end
|
8
8
|
|
9
9
|
def comic(id)
|
10
|
-
response = self.class.get(
|
10
|
+
response = self.class.get(router.comic_path(:id => id), :query => params)
|
11
11
|
build_response_object(response)
|
12
12
|
end
|
13
13
|
|
14
14
|
def comic_characters(id, query_params = {})
|
15
|
-
response = self.class.get(
|
15
|
+
response = self.class.get(router.comic_characters_path(:id => id), :query => params(query_params))
|
16
16
|
build_response_object(response)
|
17
17
|
end
|
18
18
|
|
19
19
|
def comic_events(id, query_params = {})
|
20
|
-
response = self.class.get(
|
20
|
+
response = self.class.get(router.comic_events_path(:id => id), :query => params(query_params))
|
21
21
|
build_response_object(response)
|
22
22
|
end
|
23
23
|
|
24
24
|
def comic_creators(id, query_params = {})
|
25
|
-
response = self.class.get(
|
25
|
+
response = self.class.get(router.comic_creators_path(:id => id), :query => params(query_params))
|
26
26
|
build_response_object(response)
|
27
27
|
end
|
28
28
|
|
29
29
|
def comic_stories(id, query_params = {})
|
30
|
-
response = self.class.get(
|
30
|
+
response = self.class.get(router.comic_stories_path(:id => id), :query => params(query_params))
|
31
31
|
build_response_object(response)
|
32
32
|
end
|
33
33
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
1:
|
2
|
+
name: 'characters'
|
3
|
+
path: '/public/characters'
|
4
|
+
2:
|
5
|
+
name: 'character'
|
6
|
+
path: '/public/characters/:id'
|
7
|
+
3:
|
8
|
+
name: 'character_comics'
|
9
|
+
path: '/public/characters/:id/comics'
|
10
|
+
4:
|
11
|
+
name: 'character_events'
|
12
|
+
path: '/public/characters/:id/events'
|
13
|
+
5:
|
14
|
+
name: 'character_series'
|
15
|
+
path: '/public/characters/:id/series'
|
16
|
+
6:
|
17
|
+
name: 'character_stories'
|
18
|
+
path: '/public/characters/:id/stories'
|
19
|
+
7:
|
20
|
+
name: 'comics'
|
21
|
+
path: '/public/comics'
|
22
|
+
8:
|
23
|
+
name: 'comic'
|
24
|
+
path: '/public/comics/:id'
|
25
|
+
9:
|
26
|
+
name: 'comic_characters'
|
27
|
+
path: '/public/comics/:id/characters'
|
28
|
+
10:
|
29
|
+
name: 'comic_creators'
|
30
|
+
path: '/public/comics/:id/creators'
|
31
|
+
11:
|
32
|
+
name: 'comic_events'
|
33
|
+
path: '/public/comics/:id/events'
|
34
|
+
12:
|
35
|
+
name: 'comic_stories'
|
36
|
+
path: '/public/comics/:id/stories'
|
37
|
+
13:
|
38
|
+
name: 'events'
|
39
|
+
path: '/public/events'
|
40
|
+
14:
|
41
|
+
name: 'event'
|
42
|
+
path: '/public/events/:id'
|
43
|
+
15:
|
44
|
+
name: 'event_characters'
|
45
|
+
path: '/public/events/:id/characters'
|
46
|
+
16:
|
47
|
+
name: 'event_creators'
|
48
|
+
path: '/public/events/:id/creators'
|
49
|
+
17:
|
50
|
+
name: 'event_comics'
|
51
|
+
path: '/public/events/:id/comics'
|
52
|
+
18:
|
53
|
+
name: 'event_stories'
|
54
|
+
path: '/public/events/:id/stories'
|
55
|
+
19:
|
56
|
+
name: 'event_series'
|
57
|
+
path: '/public/events/:id/series'
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Marvelite
|
2
|
+
module API
|
3
|
+
module EventMethods
|
4
|
+
def events(query_params = {})
|
5
|
+
response = self.class.get(router.events_path, :query => params(query_params))
|
6
|
+
build_response_object(response)
|
7
|
+
end
|
8
|
+
|
9
|
+
def event(id)
|
10
|
+
by_name = id.is_a?(String) ? true : false
|
11
|
+
response = if by_name
|
12
|
+
find_event_by_name(id)
|
13
|
+
else
|
14
|
+
# self.class.get(router.character_path(:id => value), :query => params)
|
15
|
+
self.class.get(router.event_path(:id => id), :query => params)
|
16
|
+
end
|
17
|
+
build_response_object(response)
|
18
|
+
end
|
19
|
+
|
20
|
+
def event_characters(id, query_params = {})
|
21
|
+
if id.is_a?(String)
|
22
|
+
event = find_event_by_name(id)
|
23
|
+
return false unless event
|
24
|
+
id = event.id
|
25
|
+
end
|
26
|
+
response = self.class.get(router.event_characters_path(:id => id), :query => params(query_params))
|
27
|
+
build_response_object(response)
|
28
|
+
end
|
29
|
+
|
30
|
+
def event_comics(id, query_params = {})
|
31
|
+
if id.is_a?(String)
|
32
|
+
event = find_event_by_name(id)
|
33
|
+
return false unless event
|
34
|
+
id = event.id
|
35
|
+
end
|
36
|
+
response = self.class.get(router.event_comics_path(:id => id), :query => params(query_params))
|
37
|
+
build_response_object(response)
|
38
|
+
end
|
39
|
+
|
40
|
+
def event_creators(id, query_params = {})
|
41
|
+
if id.is_a?(String)
|
42
|
+
event = find_event_by_name(id)
|
43
|
+
return false unless event
|
44
|
+
id = event.id
|
45
|
+
end
|
46
|
+
response = self.class.get(router.event_creators_path(:id => id), :query => params(query_params))
|
47
|
+
build_response_object(response)
|
48
|
+
end
|
49
|
+
|
50
|
+
def event_series(id, query_params = {})
|
51
|
+
if id.is_a?(String)
|
52
|
+
event = find_event_by_name(id)
|
53
|
+
return false unless event
|
54
|
+
id = event.id
|
55
|
+
end
|
56
|
+
response = self.class.get(router.event_series_path(:id => id), :query => params(query_params))
|
57
|
+
build_response_object(response)
|
58
|
+
end
|
59
|
+
|
60
|
+
def event_stories(id, query_params = {})
|
61
|
+
if id.is_a?(String)
|
62
|
+
event = find_event_by_name(id)
|
63
|
+
return false unless event
|
64
|
+
id = event.id
|
65
|
+
end
|
66
|
+
response = self.class.get(router.event_stories_path(:id => id), :query => params(query_params))
|
67
|
+
build_response_object(response)
|
68
|
+
end
|
69
|
+
|
70
|
+
protected
|
71
|
+
def find_event_by_name(name)
|
72
|
+
response = self.events(:name => name)
|
73
|
+
return false unless response[:data][:results].size > 0
|
74
|
+
|
75
|
+
response.id = response[:data][:results][0][:id]
|
76
|
+
response
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/marvelite/api/router.rb
CHANGED
@@ -1,52 +1,47 @@
|
|
1
1
|
module Marvelite
|
2
2
|
module API
|
3
3
|
class Router
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
def character_path(id)
|
9
|
-
"public/characters/#{id}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def character_comics_path(id)
|
13
|
-
"public/characters/#{id}/comics"
|
14
|
-
end
|
15
|
-
|
16
|
-
def character_events_path(id)
|
17
|
-
"public/characters/#{id}/events"
|
18
|
-
end
|
19
|
-
|
20
|
-
def character_series_path(id)
|
21
|
-
"public/characters/#{id}/series"
|
22
|
-
end
|
23
|
-
|
24
|
-
def character_stories_path(id)
|
25
|
-
"public/characters/#{id}/stories"
|
26
|
-
end
|
4
|
+
require 'yaml'
|
5
|
+
attr_accessor :api_version
|
27
6
|
|
28
|
-
def
|
29
|
-
|
7
|
+
def initialize(attrs = {})
|
8
|
+
@api_version = attrs.fetch(:api_version) { 'v1' }
|
9
|
+
@routes = []
|
10
|
+
load_routes_from_file("#{api_version}.yml")
|
11
|
+
map_routes
|
30
12
|
end
|
31
13
|
|
32
|
-
def
|
33
|
-
"
|
14
|
+
def inspect
|
15
|
+
"#<#{self.class}:#{self.object_id}>"
|
34
16
|
end
|
35
17
|
|
36
|
-
def
|
37
|
-
"
|
18
|
+
def load_routes_from_file(filename)
|
19
|
+
file_path = File.join(File.dirname(__FILE__), "config", filename)
|
20
|
+
f = YAML.load(File.read(file_path))
|
21
|
+
f.each do |_, route|
|
22
|
+
add_route(route['name'], route['path'])
|
23
|
+
end
|
38
24
|
end
|
39
25
|
|
40
|
-
def
|
41
|
-
|
26
|
+
def routes
|
27
|
+
@routes
|
42
28
|
end
|
43
29
|
|
44
|
-
def
|
45
|
-
|
30
|
+
def add_route(name, endpoint)
|
31
|
+
route = [name, endpoint]
|
32
|
+
routes << route
|
46
33
|
end
|
47
34
|
|
48
|
-
def
|
49
|
-
|
35
|
+
def map_routes
|
36
|
+
routes.each do |name, endpoint|
|
37
|
+
self.class.send(:define_method, "#{name}_path") do |params = {}|
|
38
|
+
params
|
39
|
+
params.each do |p_key, p_value|
|
40
|
+
endpoint.gsub!(":#{p_key.to_s}", p_value.to_s)
|
41
|
+
end
|
42
|
+
"/#{api_version}#{endpoint}"
|
43
|
+
end
|
44
|
+
end
|
50
45
|
end
|
51
46
|
end
|
52
47
|
end
|