thanos 0.0.1 → 0.5.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 +4 -4
- data/.gitignore +15 -0
- data/.hound.yml +64 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +17 -18
- data/README.md +93 -16
- data/Rakefile +16 -0
- data/bin/console +13 -0
- data/bin/setup +7 -0
- data/lib/thanos.rb +9 -4
- data/lib/thanos/api/authentication.rb +19 -0
- data/lib/thanos/api/client.rb +26 -0
- data/lib/thanos/api/response.rb +16 -0
- data/lib/thanos/authentication.rb +5 -0
- data/lib/thanos/client.rb +21 -0
- data/lib/thanos/factories/character.rb +17 -0
- data/lib/thanos/factories/comic.rb +17 -0
- data/lib/thanos/factories/creator.rb +17 -0
- data/lib/thanos/factories/date.rb +17 -0
- data/lib/thanos/factories/event.rb +17 -0
- data/lib/thanos/factories/image.rb +17 -0
- data/lib/thanos/factories/item/character.rb +19 -0
- data/lib/thanos/factories/item/comic.rb +19 -0
- data/lib/thanos/factories/item/creator.rb +19 -0
- data/lib/thanos/factories/item/event.rb +23 -0
- data/lib/thanos/factories/item/series.rb +23 -0
- data/lib/thanos/factories/item/story.rb +19 -0
- data/lib/thanos/factories/price.rb +17 -0
- data/lib/thanos/factories/series.rb +17 -0
- data/lib/thanos/factories/story.rb +17 -0
- data/lib/thanos/factories/text_object.rb +17 -0
- data/lib/thanos/factories/thumbnail.rb +22 -0
- data/lib/thanos/factories/url.rb +17 -0
- data/lib/thanos/finders/character_finder.rb +28 -0
- data/lib/thanos/finders/comic_finder.rb +30 -0
- data/lib/thanos/finders/creator_finder.rb +31 -0
- data/lib/thanos/finders/event_finder.rb +26 -0
- data/lib/thanos/finders/finder_validator.rb +15 -0
- data/lib/thanos/finders/series_finder.rb +24 -0
- data/lib/thanos/finders/story_finder.rb +24 -0
- data/lib/thanos/mappers/character_data_mapper.rb +26 -0
- data/lib/thanos/mappers/comic_data_mapper.rb +41 -0
- data/lib/thanos/mappers/creator_data_mapper.rb +30 -0
- data/lib/thanos/mappers/event_data_mapper.rb +31 -0
- data/lib/thanos/mappers/mappable.rb +100 -0
- data/lib/thanos/mappers/series_data_mapper.rb +33 -0
- data/lib/thanos/mappers/story_data_mapper.rb +25 -0
- data/lib/thanos/resources/character.rb +19 -0
- data/lib/thanos/resources/comic.rb +27 -0
- data/lib/thanos/resources/creator.rb +13 -0
- data/lib/thanos/resources/date.rb +10 -0
- data/lib/thanos/resources/event.rb +26 -0
- data/lib/thanos/resources/image.rb +9 -0
- data/lib/thanos/resources/item/character.rb +20 -0
- data/lib/thanos/resources/item/comic.rb +20 -0
- data/lib/thanos/resources/item/creator.rb +19 -0
- data/lib/thanos/resources/item/event.rb +20 -0
- data/lib/thanos/resources/item/series.rb +18 -0
- data/lib/thanos/resources/item/story.rb +20 -0
- data/lib/thanos/resources/price.rb +10 -0
- data/lib/thanos/resources/series.rb +23 -0
- data/lib/thanos/resources/story.rb +18 -0
- data/lib/thanos/resources/text_object.rb +11 -0
- data/lib/thanos/resources/thumbnail.rb +11 -0
- data/lib/thanos/resources/url.rb +10 -0
- data/lib/thanos/response_holder.rb +10 -0
- data/lib/thanos/string_actions.rb +7 -0
- data/lib/thanos/version.rb +1 -1
- data/spikes/call_marvel_api.rb +50 -0
- data/spikes/call_marvel_via_thanos.rb +28 -0
- data/thanos.gemspec +44 -0
- metadata +171 -26
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'thanos/api/client'
|
2
|
+
require 'thanos/response_holder'
|
3
|
+
require 'thanos/factories/event'
|
4
|
+
|
5
|
+
module Thanos
|
6
|
+
class EventFinder
|
7
|
+
ATTRIBUTES = [:name, :nameStartsWith, :modifiedSince, :creators, :series,
|
8
|
+
:comics, :stories, :characters, :orderBy, :limit, :offset]
|
9
|
+
|
10
|
+
ATTRIBUTES.each do |attribute|
|
11
|
+
parameter = StringActions.parameterize(attribute.to_s)
|
12
|
+
define_method("find_by_#{parameter}") do |attr|
|
13
|
+
find("#{attribute}".to_sym => attr)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def find(attribute)
|
20
|
+
FinderValidator.validate(attribute, ATTRIBUTES)
|
21
|
+
response = Thanos::API::Client.new.get(:events, attribute)
|
22
|
+
results = Thanos::ResponseHolder.new(response).results
|
23
|
+
Thanos::Factory::Event.new(results).build
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Thanos
|
2
|
+
class FinderValidator
|
3
|
+
class << self
|
4
|
+
def validate(params, allowed_params)
|
5
|
+
not_allowed = params.keys - allowed_params
|
6
|
+
unless not_allowed.empty?
|
7
|
+
raise InvalidParamsError, "Invalid parameters: #{not_allowed}"
|
8
|
+
end
|
9
|
+
true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class InvalidParamsError < Exception; end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'thanos/api/client'
|
2
|
+
require 'thanos/response_holder'
|
3
|
+
require 'thanos/factories/series'
|
4
|
+
|
5
|
+
module Thanos
|
6
|
+
class SeriesFinder
|
7
|
+
ATTRIBUTES = [:name, :modifiedSince, :creators, :characters, :series,
|
8
|
+
:comics, :stories, :orderBy, :limit, :offset]
|
9
|
+
|
10
|
+
ATTRIBUTES.each do |attribute|
|
11
|
+
parameter = StringActions.parameterize(attribute.to_s)
|
12
|
+
define_method("find_by_#{parameter}") do |attr|
|
13
|
+
find("#{attribute}".to_sym => attr)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def find(attribute)
|
18
|
+
FinderValidator.validate(attribute, ATTRIBUTES)
|
19
|
+
response = Thanos::API::Client.new.get(:series, attribute)
|
20
|
+
results = Thanos::ResponseHolder.new(response).results
|
21
|
+
Thanos::Factory::Series.new(results).build
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'thanos/api/client'
|
2
|
+
require 'thanos/response_holder'
|
3
|
+
require 'thanos/factories/story'
|
4
|
+
|
5
|
+
module Thanos
|
6
|
+
class StoryFinder
|
7
|
+
ATTRIBUTES = [:modifiedSince, :comics, :series, :events, :creators,
|
8
|
+
:characters]
|
9
|
+
|
10
|
+
ATTRIBUTES.each do |attribute|
|
11
|
+
parameter = StringActions.parameterize(attribute.to_s)
|
12
|
+
define_method("find_by_#{parameter}") do |attr|
|
13
|
+
find("#{attribute}".to_sym => attr)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def find(attribute)
|
18
|
+
FinderValidator.validate(attribute, ATTRIBUTES)
|
19
|
+
response = Thanos::API::Client.new.get(:stories, attribute)
|
20
|
+
results = Thanos::ResponseHolder.new(response).results
|
21
|
+
Thanos::Factory::Story.new(results).build
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'thanos/mappers/mappable'
|
2
|
+
|
3
|
+
module Thanos
|
4
|
+
class CharacterDataMapper
|
5
|
+
include Thanos::Mappable
|
6
|
+
|
7
|
+
def initialize(results)
|
8
|
+
@results = results
|
9
|
+
end
|
10
|
+
|
11
|
+
def map
|
12
|
+
{
|
13
|
+
id: @results['id'],
|
14
|
+
name: @results['name'],
|
15
|
+
description: @results['description'],
|
16
|
+
resource_uri: @results['resourceURI'],
|
17
|
+
urls: urls,
|
18
|
+
thumbnail: thumbnail,
|
19
|
+
comics: comics,
|
20
|
+
stories: stories,
|
21
|
+
events: events,
|
22
|
+
series: series,
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'thanos/mappers/mappable'
|
2
|
+
|
3
|
+
module Thanos
|
4
|
+
class ComicDataMapper
|
5
|
+
include Thanos::Mappable
|
6
|
+
|
7
|
+
def initialize(results)
|
8
|
+
@results = results
|
9
|
+
end
|
10
|
+
|
11
|
+
def map
|
12
|
+
{
|
13
|
+
id: @results['id'],
|
14
|
+
title: @results['title'],
|
15
|
+
description: @results['description'],
|
16
|
+
resource_uri: @results['resourceURI'],
|
17
|
+
format: @results['format'],
|
18
|
+
digital_id: @results['digitalId'],
|
19
|
+
issue_number: @results['issueNumber'],
|
20
|
+
variant_description: @results['variantDescription'],
|
21
|
+
isbn: @results['isbn'],
|
22
|
+
upc: @results['upc'],
|
23
|
+
diamond_code: @results['diamondCode'],
|
24
|
+
ean: @results['ean'],
|
25
|
+
issn: @results['issn'],
|
26
|
+
page_count: @results['pageCount'],
|
27
|
+
urls: urls,
|
28
|
+
thumbnail: thumbnail,
|
29
|
+
stories: stories,
|
30
|
+
events: events,
|
31
|
+
series: series,
|
32
|
+
creators: creators,
|
33
|
+
characters: characters,
|
34
|
+
prices: prices,
|
35
|
+
dates: dates,
|
36
|
+
images: images,
|
37
|
+
text_objects: text_objects,
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'thanos/mappers/mappable'
|
2
|
+
|
3
|
+
module Thanos
|
4
|
+
class CreatorDataMapper
|
5
|
+
include Thanos::Mappable
|
6
|
+
|
7
|
+
def initialize(results)
|
8
|
+
@results = results
|
9
|
+
end
|
10
|
+
|
11
|
+
def map
|
12
|
+
{
|
13
|
+
id: @results['id'],
|
14
|
+
first_name: @results['firstName'],
|
15
|
+
middle_name: @results['middleName'],
|
16
|
+
last_name: @results['lastName'],
|
17
|
+
suffix: @results['suffix'],
|
18
|
+
full_name: @results['fullName'],
|
19
|
+
description: @results['description'],
|
20
|
+
resource_uri: @results['resourceURI'],
|
21
|
+
urls: urls,
|
22
|
+
thumbnail: thumbnail,
|
23
|
+
series: series,
|
24
|
+
stories: stories,
|
25
|
+
comics: comics,
|
26
|
+
events: events,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'thanos/mappers/mappable'
|
2
|
+
|
3
|
+
module Thanos
|
4
|
+
class EventDataMapper
|
5
|
+
include Thanos::Mappable
|
6
|
+
|
7
|
+
def initialize(results)
|
8
|
+
@results = results
|
9
|
+
end
|
10
|
+
|
11
|
+
def map
|
12
|
+
{
|
13
|
+
id: @results['id'],
|
14
|
+
title: @results['title'],
|
15
|
+
description: @results['description'],
|
16
|
+
resource_uri: @results['resourceURI'],
|
17
|
+
start: start_date,
|
18
|
+
end: end_date,
|
19
|
+
urls: urls,
|
20
|
+
thumbnail: thumbnail,
|
21
|
+
creators: creators,
|
22
|
+
characters: characters,
|
23
|
+
series: series,
|
24
|
+
stories: stories,
|
25
|
+
comics: comics,
|
26
|
+
next: next_event,
|
27
|
+
previous: previous_event,
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'thanos/factories/url'
|
2
|
+
require 'thanos/factories/thumbnail'
|
3
|
+
require 'thanos/factories/price'
|
4
|
+
require 'thanos/factories/date'
|
5
|
+
require 'thanos/factories/image'
|
6
|
+
require 'thanos/factories/text_object'
|
7
|
+
|
8
|
+
require 'thanos/factories/item/comic'
|
9
|
+
require 'thanos/factories/item/story'
|
10
|
+
require 'thanos/factories/item/event'
|
11
|
+
require 'thanos/factories/item/series'
|
12
|
+
require 'thanos/factories/item/character'
|
13
|
+
require 'thanos/factories/item/creator'
|
14
|
+
|
15
|
+
module Thanos
|
16
|
+
module Mappable
|
17
|
+
private
|
18
|
+
|
19
|
+
def urls
|
20
|
+
Thanos::Factory::Url.new(@results['urls']).build
|
21
|
+
end
|
22
|
+
|
23
|
+
def thumbnail
|
24
|
+
# TODO: Determine if I should just create the resource thumbnail directly.
|
25
|
+
# The rationale is that thumbnails may never have more than one
|
26
|
+
# entry, in which case using the factory to build a collection is
|
27
|
+
# not necessary.
|
28
|
+
# Thanos::Thumbnail.new(@results['thumbnail']) if @results['thumbnail']
|
29
|
+
|
30
|
+
return unless @results['thumbnail']
|
31
|
+
Thanos::Factory::Thumbnail.new(@results['thumbnail']).build
|
32
|
+
end
|
33
|
+
|
34
|
+
def start_date
|
35
|
+
DateTime.parse(@results['start'])
|
36
|
+
end
|
37
|
+
|
38
|
+
def end_date
|
39
|
+
DateTime.parse(@results['end'])
|
40
|
+
end
|
41
|
+
|
42
|
+
def comics
|
43
|
+
Thanos::Factory::Item::Comic.new(@results['comics']['items']).build
|
44
|
+
end
|
45
|
+
|
46
|
+
def stories
|
47
|
+
Thanos::Factory::Item::Story.new(@results['stories']['items']).build
|
48
|
+
end
|
49
|
+
|
50
|
+
def events
|
51
|
+
Thanos::Factory::Item::Event.new(@results['events']['items']).build
|
52
|
+
end
|
53
|
+
|
54
|
+
def series
|
55
|
+
Thanos::Factory::Item::Series.new(
|
56
|
+
@results['series']['items'] || @results['series']).build
|
57
|
+
end
|
58
|
+
|
59
|
+
def creators
|
60
|
+
Thanos::Factory::Item::Creator.new(@results['creators']['items']).build
|
61
|
+
end
|
62
|
+
|
63
|
+
def characters
|
64
|
+
Thanos::Factory::Item::Character.new(
|
65
|
+
@results['characters']['items']).build
|
66
|
+
end
|
67
|
+
|
68
|
+
def prices
|
69
|
+
Thanos::Factory::Price.new(@results['prices']).build
|
70
|
+
end
|
71
|
+
|
72
|
+
def dates
|
73
|
+
Thanos::Factory::Date.new(@results['dates']).build
|
74
|
+
end
|
75
|
+
|
76
|
+
def images
|
77
|
+
Thanos::Factory::Image.new(@results['images']).build
|
78
|
+
end
|
79
|
+
|
80
|
+
def text_objects
|
81
|
+
Thanos::Factory::TextObject.new(@results['textObjects']).build
|
82
|
+
end
|
83
|
+
|
84
|
+
def next_event
|
85
|
+
Thanos::Factory::Item::Event.new(@results['next']).build.first
|
86
|
+
end
|
87
|
+
|
88
|
+
def previous_event
|
89
|
+
Thanos::Factory::Item::Event.new(@results['previous']).build.first
|
90
|
+
end
|
91
|
+
|
92
|
+
def next_series
|
93
|
+
Thanos::Factory::Item::Series.new(@results['next']).build
|
94
|
+
end
|
95
|
+
|
96
|
+
def previous_series
|
97
|
+
Thanos::Factory::Item::Series.new(@results['previous']).build
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'thanos/mappers/mappable'
|
2
|
+
|
3
|
+
module Thanos
|
4
|
+
class SeriesDataMapper
|
5
|
+
include Thanos::Mappable
|
6
|
+
|
7
|
+
def initialize(results)
|
8
|
+
@results = results
|
9
|
+
end
|
10
|
+
|
11
|
+
def map
|
12
|
+
{
|
13
|
+
id: @results['id'],
|
14
|
+
title: @results['title'],
|
15
|
+
description: @results['description'],
|
16
|
+
resource_uri: @results['resourceURI'],
|
17
|
+
start_year: @results['startYear'],
|
18
|
+
end_year: @results['endYear'],
|
19
|
+
rating: @results['rating'],
|
20
|
+
type: @results['type'],
|
21
|
+
urls: urls,
|
22
|
+
thumbnail: thumbnail,
|
23
|
+
comics: comics,
|
24
|
+
stories: stories,
|
25
|
+
events: events,
|
26
|
+
creators: creators,
|
27
|
+
characters: characters,
|
28
|
+
next: next_series.first,
|
29
|
+
previous: previous_series.first,
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'thanos/mappers/mappable'
|
2
|
+
|
3
|
+
module Thanos
|
4
|
+
class StoryDataMapper
|
5
|
+
include Thanos::Mappable
|
6
|
+
|
7
|
+
def initialize(results)
|
8
|
+
@results = results
|
9
|
+
end
|
10
|
+
|
11
|
+
def map
|
12
|
+
{
|
13
|
+
title: @results['title'],
|
14
|
+
description: @results['description'],
|
15
|
+
type: @results['type'],
|
16
|
+
resource_uri: @results['resourceURI'],
|
17
|
+
characters: characters,
|
18
|
+
creators: creators,
|
19
|
+
events: events,
|
20
|
+
series: series,
|
21
|
+
comics: comics,
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Thanos
|
2
|
+
class Character
|
3
|
+
attr_reader :id, :name, :description, :resource_uri, :urls, :thumbnail,
|
4
|
+
:comics, :stories, :events, :series
|
5
|
+
|
6
|
+
def initialize(args)
|
7
|
+
@comics = args[:comics]
|
8
|
+
@series = args[:series]
|
9
|
+
@events = args[:events]
|
10
|
+
@stories = args[:stories]
|
11
|
+
@urls = args[:urls]
|
12
|
+
@thumbnail = args[:thumbnail]
|
13
|
+
|
14
|
+
args[:attributes].each do |attribute, value|
|
15
|
+
instance_variable_set("@#{attribute}", value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Thanos
|
2
|
+
class Comic
|
3
|
+
attr_reader :id, :title, :description, :format, :resource_uri,
|
4
|
+
:issue_number, :ean, :isbn, :upc, :issn, :page_count,
|
5
|
+
:digital_id, :diamond_code, :variant_description, :dates,
|
6
|
+
:urls, :thumbnail, :text_objects, :images, :prices,
|
7
|
+
:stories, :creators, :series, :events, :characters
|
8
|
+
|
9
|
+
def initialize(args)
|
10
|
+
@series = args[:series]
|
11
|
+
@stories = args[:stories]
|
12
|
+
@creators = args[:creators]
|
13
|
+
@events = args[:events]
|
14
|
+
@characters = args[:characters]
|
15
|
+
@urls = args[:urls]
|
16
|
+
@prices = args[:prices]
|
17
|
+
@images = args[:images]
|
18
|
+
@thumbnail = args[:thumbnail]
|
19
|
+
@text_objects = args[:text_objects]
|
20
|
+
@dates = args[:dates]
|
21
|
+
|
22
|
+
args[:attributes].each do |attribute, value|
|
23
|
+
instance_variable_set("@#{attribute}", value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Thanos
|
2
|
+
class Creator
|
3
|
+
attr_reader :id, :first_name, :middle_name, :last_name, :suffix,
|
4
|
+
:full_name, :description, :resource_uri, :urls, :thumbnail,
|
5
|
+
:series, :stories, :comics, :events
|
6
|
+
|
7
|
+
def initialize(args)
|
8
|
+
args[:attributes].each do |attribute, value|
|
9
|
+
instance_variable_set("@#{attribute}", value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|