marver 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -14
  3. data/lib/marver.rb +16 -2
  4. data/lib/marver/api.rb +9 -1
  5. data/lib/marver/api/client.rb +9 -6
  6. data/lib/marver/api/credentials.rb +1 -1
  7. data/lib/marver/api/errors.rb +33 -0
  8. data/lib/marver/client.rb +3 -1
  9. data/lib/marver/entities/character.rb +11 -23
  10. data/lib/marver/entities/comic.rb +19 -35
  11. data/lib/marver/entities/creator.rb +5 -26
  12. data/lib/marver/entities/event.rb +17 -26
  13. data/lib/marver/entities/serie.rb +15 -29
  14. data/lib/marver/entities/story.rb +11 -23
  15. data/lib/marver/entities/summary/character.rb +2 -2
  16. data/lib/marver/entities/summary/comic.rb +4 -4
  17. data/lib/marver/entities/summary/creator.rb +4 -2
  18. data/lib/marver/entities/summary/event.rb +2 -2
  19. data/lib/marver/entities/summary/serie.rb +3 -3
  20. data/lib/marver/entities/summary/story.rb +2 -2
  21. data/lib/marver/entities/url.rb +3 -3
  22. data/lib/marver/factories/character.rb +28 -0
  23. data/lib/marver/factories/comic.rb +27 -0
  24. data/lib/marver/factories/creator.rb +28 -0
  25. data/lib/marver/factories/date.rb +15 -0
  26. data/lib/marver/factories/event.rb +28 -0
  27. data/lib/marver/factories/factory.rb +20 -0
  28. data/lib/marver/factories/image.rb +15 -0
  29. data/lib/marver/factories/price.rb +15 -0
  30. data/lib/marver/factories/serie.rb +28 -0
  31. data/lib/marver/factories/story.rb +28 -0
  32. data/lib/marver/factories/summary/character.rb +23 -0
  33. data/lib/marver/factories/summary/comic.rb +23 -0
  34. data/lib/marver/factories/summary/creator.rb +23 -0
  35. data/lib/marver/factories/summary/event.rb +23 -0
  36. data/lib/marver/factories/summary/serie.rb +23 -0
  37. data/lib/marver/factories/summary/story.rb +23 -0
  38. data/lib/marver/factories/summary/summary.rb +12 -0
  39. data/lib/marver/factories/text_object.rb +16 -0
  40. data/lib/marver/factories/url.rb +15 -0
  41. data/lib/marver/finders/character_finder.rb +16 -2
  42. data/lib/marver/finders/comic_finder.rb +17 -1
  43. data/lib/marver/finders/creator_finder.rb +26 -0
  44. data/lib/marver/finders/event_finder.rb +16 -2
  45. data/lib/marver/finders/serie_finder.rb +16 -2
  46. data/lib/marver/finders/story_finder.rb +15 -2
  47. data/lib/marver/mappers/character_attributes_mapper.rb +25 -0
  48. data/lib/marver/mappers/comic_attributes_mapper.rb +40 -0
  49. data/lib/marver/mappers/creator_attributes_mapper.rb +29 -0
  50. data/lib/marver/mappers/event_attributes_mapper.rb +29 -0
  51. data/lib/marver/mappers/mappable.rb +86 -0
  52. data/lib/marver/mappers/serie_attributes_mapper.rb +32 -0
  53. data/lib/marver/mappers/story_attributes_mapper.rb +26 -0
  54. data/lib/marver/utils/finder_param_filter.rb +13 -0
  55. data/lib/marver/utils/string_helper.rb +7 -0
  56. data/lib/marver/version.rb +1 -1
  57. data/spec/marver/.DS_Store +0 -0
  58. data/spec/marver/api/client_spec.rb +1 -1
  59. data/spec/marver/api/credentials_spec.rb +2 -2
  60. data/spec/marver/api/error_spec.rb +9 -9
  61. data/spec/marver/client_spec.rb +8 -0
  62. data/spec/marver/entities/character_spec.rb +1 -1
  63. data/spec/marver/entities/comic_spec.rb +1 -1
  64. data/spec/marver/entities/creator_spec.rb +2 -2
  65. data/spec/marver/entities/event_spec.rb +1 -1
  66. data/spec/marver/entities/serie_spec.rb +2 -2
  67. data/spec/marver/entities/story_spec.rb +2 -2
  68. data/spec/marver/entities/summary/comic_spec.rb +9 -1
  69. data/spec/marver/factories/character_spec.rb +12 -0
  70. data/spec/marver/factories/comic_spec.rb +12 -0
  71. data/spec/marver/factories/creator_spec.rb +12 -0
  72. data/spec/marver/factories/date_spec.rb +13 -0
  73. data/spec/marver/factories/event_spec.rb +12 -0
  74. data/spec/marver/factories/image_spec.rb +13 -0
  75. data/spec/marver/factories/price_spec.rb +13 -0
  76. data/spec/marver/factories/serie_spec.rb +12 -0
  77. data/spec/marver/factories/story_spec.rb +12 -0
  78. data/spec/marver/factories/summary/character_spec.rb +13 -0
  79. data/spec/marver/factories/summary/comic_spec.rb +13 -0
  80. data/spec/marver/factories/summary/creator_spec.rb +13 -0
  81. data/spec/marver/factories/summary/event_spec.rb +13 -0
  82. data/spec/marver/factories/summary/serie_spec.rb +13 -0
  83. data/spec/marver/factories/summary/story_spec.rb +13 -0
  84. data/spec/marver/factories/text_object_spec.rb +13 -0
  85. data/spec/marver/factories/url_spec.rb +13 -0
  86. data/spec/marver/finders/character_finder_spec.rb +17 -9
  87. data/spec/marver/finders/comic_finder_spec.rb +11 -2
  88. data/spec/marver/finders/creator_finder_spec.rb +27 -0
  89. data/spec/marver/finders/event_finder_spec.rb +11 -2
  90. data/spec/marver/finders/serie_finder_spec.rb +10 -2
  91. data/spec/marver/finders/story_finder_spec.rb +11 -3
  92. data/spec/marver/mappers/character_attributes_mapper_spec.rb +14 -0
  93. data/spec/marver/mappers/comic_attributes_mapper_spec.rb +17 -0
  94. data/spec/marver/mappers/creator_attributes_mapper_spec.rb +15 -0
  95. data/spec/marver/mappers/event_attributes_mapper_spec.rb +14 -0
  96. data/spec/marver/mappers/serie_attributes_mapper_spec.rb +17 -0
  97. data/spec/marver/mappers/story_attributes_mapper_spec.rb +15 -0
  98. data/spec/marver/utils/finder_param_filter_spec.rb +17 -0
  99. data/spec/marver/utils/string_helper_spec.rb +7 -0
  100. metadata +86 -7
  101. data/TODO +0 -3
  102. data/lib/marver/api/error.rb +0 -13
  103. data/lib/marver/entities/commonable.rb +0 -37
  104. data/lib/marver/entities/queryable.rb +0 -12
  105. data/lib/marver/entities/summarizable.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fbf8f57412fffbdad133f75f085aee5884fac3ac
4
- data.tar.gz: 159ecf070992f3aa39fe0c5816d004c10469ab93
3
+ metadata.gz: 6749397ee2f275b76c39a716ebd42e4352b258cd
4
+ data.tar.gz: f5d09a4721ceb7ad5a748a7d2995babe02449068
5
5
  SHA512:
6
- metadata.gz: 765d37edbb611c578372a73c360aa267489422827eea9693fcfaae436ee22124a7e2a4dde661e62f5e84cb76c484315bfd54f6e5c03984e29a04aeec53bc4948
7
- data.tar.gz: 6c59c053d464407e0dfaa6a8895370534fe627195dadd0eb9914791277504415131f0cb27bd133dd364b95a73e74afb6acbfc11766a15003f899c5d76cf882cf
6
+ metadata.gz: e14a63ed2ad301af75265219df20773f8dca10b53e0b75f9f8fd9bbd1ead3f00c025a798eef6d3f68a94c02475feca7115b530bb85c52851a95326b4fcad3e23
7
+ data.tar.gz: ed49c11bc4f0241e859e294e9f70c348e0b2ec4e0a5eb0afecb80b22b6b6a6f3c151330d85aac545273c391178233f87bd0634b2f243d503ce87a2c46a5af941
data/README.md CHANGED
@@ -29,11 +29,11 @@ Marver.configure do |config|
29
29
  end
30
30
 
31
31
  client = Marver::Client.new
32
- client.characters.find({ name: 'Hulk' })
33
- client.series.find({ title: 'The Avengers' })
34
- client.events.find({ title: 'Fall of the mutants' })
35
- client.stories.find({ title: 'Name of a story' })
36
- client.comics.find({ title: 'Spiderman' })
32
+ client.characters.find_by_name 'Hulk'
33
+ client.series.find_by_title 'The Avengers'
34
+ client.events.find_by_title 'Fall of the mutants'
35
+ client.stories.find_by_title 'Name of a story'
36
+ client.comics.find_by_title 'Spiderman'
37
37
  ```
38
38
 
39
39
  Also, you can inspect summary (trimmed) objects of the associated entities to one entity.
@@ -45,7 +45,7 @@ Marver.configure do |config|
45
45
  end
46
46
 
47
47
  client = Marver::Client.new
48
- hulk = client.characters.find({ name: 'Hulk' })
48
+ hulk = client.characters.find_by_name 'Hulk'
49
49
  hulk.comics # Returns an array of comics summaries
50
50
  hulk.stories # Returns an array of stories where Hulk appears
51
51
  ```
@@ -58,14 +58,8 @@ comic.full # This will issue an API call and grab the full object with all data
58
58
  ```
59
59
 
60
60
  ### TO DO:
61
-
62
- ##### Entity Finder classes
63
- Should be implemented within the Marver::Client class.
64
-
65
- CreatorFinder
61
+ Inspect dependency graph?
66
62
 
67
63
  #### Author
68
64
  Ile Eftimov <br/>
69
- [twitter](http://twitter.com/fteem) [website](http://eftimov.net)
70
-
71
- Any kind of contribution is welcomed & encouraged :)
65
+ [twitter](http://twitter.com/fteem) [website](http://eftimov.net)
@@ -3,6 +3,7 @@ require 'time'
3
3
  require 'marver/version'
4
4
 
5
5
  module Marver
6
+ FINDER_FILTERS = [ :orderBy, :limit, :offset ]
6
7
 
7
8
  # Base Classes
8
9
  autoload :Client, 'marver/client'
@@ -15,12 +16,26 @@ module Marver
15
16
  autoload :ComicFinder, 'marver/finders/comic_finder'
16
17
  autoload :EventFinder, 'marver/finders/event_finder'
17
18
  autoload :StoryFinder, 'marver/finders/story_finder'
19
+ autoload :CreatorFinder, 'marver/finders/creator_finder'
20
+
21
+ #Factories
22
+ autoload :Factory, 'marver/factories/factory'
18
23
 
19
24
  # API
20
25
  autoload :API, 'marver/api'
21
26
 
22
27
  # Helpers & builders
23
- autoload :StringHelper, 'marver/helpers/string_helper'
28
+ autoload :StringHelper, 'marver/utils/string_helper'
29
+ autoload :FinderParamFilter, 'marver/utils/finder_param_filter'
30
+
31
+ # Mappers
32
+ autoload :Mappable, 'marver/mappers/mappable'
33
+ autoload :ComicAttributesMapper, 'marver/mappers/comic_attributes_mapper'
34
+ autoload :CharacterAttributesMapper, 'marver/mappers/character_attributes_mapper'
35
+ autoload :CreatorAttributesMapper, 'marver/mappers/creator_attributes_mapper'
36
+ autoload :EventAttributesMapper, 'marver/mappers/event_attributes_mapper'
37
+ autoload :SerieAttributesMapper, 'marver/mappers/serie_attributes_mapper'
38
+ autoload :StoryAttributesMapper, 'marver/mappers/story_attributes_mapper'
24
39
 
25
40
  # Common Entities
26
41
  autoload :TextObject, 'marver/entities/text_object'
@@ -42,7 +57,6 @@ module Marver
42
57
 
43
58
  autoload :Summarizable, 'marver/entities/summarizable'
44
59
  autoload :Commonable, 'marver/entities/commonable'
45
- autoload :Queryable, 'marver/entities/queryable'
46
60
 
47
61
 
48
62
  class << self
@@ -3,6 +3,14 @@ module Marver
3
3
  autoload :Client, 'marver/api/client'
4
4
  autoload :Response, 'marver/api/response'
5
5
  autoload :Credentials, 'marver/api/credentials'
6
- autoload :Error, 'marver/api/error'
6
+ autoload :ErrorHandler, 'marver/api/errors'
7
+ end
8
+
9
+ module Error
10
+ autoload :Conflict, 'marver/api/errors'
11
+ autoload :NotFound, 'marver/api/errors'
12
+ autoload :CredentialsFault, 'marver/api/errors'
13
+ autoload :MethodNotAllowed, 'marver/api/errors'
14
+ autoload :Forbidden, 'marver/api/errors'
7
15
  end
8
16
  end
@@ -4,19 +4,22 @@ require 'digest/md5'
4
4
  module Marver
5
5
  module API
6
6
  class Client
7
- include Marver::Queryable
8
-
9
7
  API_VERSION = "v1"
10
8
  API_ENDPOINT = "http://gateway.marvel.com"
11
9
 
12
10
  def get(entity, options)
13
- query_string = options.empty? ? "" : hash_to_querystring(options)
14
- url = endpoint + "#{entity.to_s}?" + query_string + credentials
15
- Marver::API::Response.new(RestClient.get(url))
11
+ url = "#{endpoint}/#{entity.to_s}"
12
+ json = RestClient.get url, { params: options.merge(credentials) }
13
+ Marver::API::Response.new(json)
14
+ end
15
+
16
+ def get_uri(uri)
17
+ response = RestClient.get uri, { params: credentials }
18
+ Marver::API::Response.new(response)
16
19
  end
17
20
 
18
21
  def endpoint
19
- "#{API_ENDPOINT}/#{API_VERSION}/public/"
22
+ "#{API_ENDPOINT}/#{API_VERSION}/public"
20
23
  end
21
24
 
22
25
  def credentials
@@ -12,7 +12,7 @@ module Marver
12
12
  timestamp = Time.now.to_i.to_s
13
13
  hash = Digest::MD5.hexdigest(timestamp + private_key + public_key)
14
14
 
15
- "&ts=#{timestamp}&apikey=#{public_key}&hash=#{hash}"
15
+ { ts: timestamp, apikey: public_key, hash: hash }
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,33 @@
1
+ module Marver
2
+ module API
3
+ class ErrorHandler
4
+ def initialize(ex)
5
+ @message = ex.response['status']
6
+ end
7
+
8
+ def handle!
9
+ case @code
10
+ when 401
11
+ raise Marver::Error::CredentialsFault.new(@message)
12
+ when 403
13
+ raise Marver::Error::MethodNotAllowed.new(@message)
14
+ when 404
15
+ raise Marver::Error::NotFound.new(@message)
16
+ when 405
17
+ raise Marver::Error::Forbidden.new(@message)
18
+ when 409
19
+ raise Marver::Error::Conflict.new(@message)
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ module Error
27
+ class Conflict < Exception; end
28
+ class NotFound < Exception; end
29
+ class CredentialsFault < Exception; end
30
+ class MethodNotAllowed < Exception; end
31
+ class Forbidden < Exception; end
32
+ end
33
+ end
@@ -2,13 +2,15 @@ require './lib/marver.rb'
2
2
 
3
3
  module Marver
4
4
  class Client
5
- attr_reader :characters, :series, :comics, :stories
5
+ attr_reader :characters, :series, :comics, :stories, :creators, :events
6
6
 
7
7
  def initialize
8
8
  @characters = Marver::CharacterFinder.new
9
9
  @series = Marver::SerieFinder.new
10
10
  @comics = Marver::ComicFinder.new
11
11
  @stories = Marver::StoryFinder.new
12
+ @creators = Marver::CreatorFinder.new
13
+ @events = Marver::EventFinder.new
12
14
  end
13
15
 
14
16
  end
@@ -2,32 +2,20 @@ require './lib/marver.rb'
2
2
 
3
3
  module Marver
4
4
  class Character
5
- include Marver::Summarizable
6
- include Marver::Commonable
5
+ attr_reader :id, :resource_uri, :description, :thumbnail, :urls, :name,
6
+ :series, :stories, :events, :comics, :full_path
7
7
 
8
- attr_reader :json, :id, :resource_uri, :description, :name
8
+ def initialize(args)
9
+ @series = args[:series]
10
+ @stories = args[:stories]
11
+ @events = args[:events]
12
+ @comics = args[:comics]
13
+ @urls = args[:urls]
14
+ @thumbnail = args[:thumbnail]
9
15
 
10
- class << self
11
- def build(results)
12
- if results.kind_of?(Array)
13
- results.collect do |character|
14
- Marver::Character.new(character)
15
- end
16
- else
17
- new(results)
18
- end
16
+ args[:attributes].each do |name, value|
17
+ instance_variable_set("@#{name}", value)
19
18
  end
20
19
  end
21
-
22
- def initialize(json)
23
- @json = json
24
-
25
- @description = json['description']
26
-
27
- @id = json['id'].to_i
28
- @name = json['name']
29
- @resource_uri = json['resourceURI']
30
- end
31
-
32
20
  end
33
21
  end
@@ -2,43 +2,27 @@ require './lib/marver.rb'
2
2
 
3
3
  module Marver
4
4
  class Comic
5
- include Marver::Summarizable
6
- include Marver::Commonable
5
+ attr_reader :id, :title, :stories, :series, :events, :characters, :variant_description,
6
+ :images, :ean, :format, :resource_uri, :stories, :text_objects, :digital_id,
7
+ :isbn, :diamond_code, :thumbnail, :upc, :issue_number, :prices, :issn, :dates,
8
+ :urls, :page_count, :description, :creators
7
9
 
8
- attr_reader :json, :id, :digital_id, :title, :issue_number,
9
- :variant_description, :description, :isbn,
10
- :upc, :diamond_code, :ean, :issn, :format,
11
- :page_count, :resource_uri
10
+ def initialize(args)
11
+ @series = args[:series]
12
+ @stories = args[:stories]
13
+ @creators = args[:creators]
14
+ @events = args[:events]
15
+ @characters = args[:characters]
16
+ @urls = args[:urls]
17
+ @prices = args[:prices]
18
+ @images = args[:images]
19
+ @thumbnail = args[:thumbnail]
20
+ @text_objects = args[:text_objects]
21
+ @dates = args[:dates]
12
22
 
13
- class << self
14
- def build(results)
15
- if results.kind_of?(Array)
16
- results.collect do |comic|
17
- Marver::Comic.new(comic)
18
- end
19
- else
20
- new(results)
21
- end
23
+ args[:attributes].each do |name, value|
24
+ instance_variable_set("@#{name}", value)
22
25
  end
23
26
  end
24
-
25
- def initialize(json)
26
- @json = json
27
- @title = json['title']
28
- @resource_uri = json['resourceURI']
29
- @id = json['id'].to_i
30
- @digital_id = json['digitalId']
31
- @issue_number = json['issueNumber']
32
- @variant_description = json['variantDescription']
33
- @description = json['description']
34
- @isbn = json['isbn']
35
- @upc = json['upc']
36
- @diamond_code = json['diamondCode']
37
- @ean = json['ean']
38
- @issn = json['issn']
39
- @format = json['format']
40
- @page_count = json['pageCount']
41
- end
42
-
43
27
  end
44
- end
28
+ end
@@ -1,33 +1,12 @@
1
1
  module Marver
2
2
  class Creator
3
- include Marver::Summarizable
4
- include Marver::Commonable
3
+ attr_reader :id, :first_name, :middle_name, :last_name, :full_name, :urls,
4
+ :suffix, :resource_uri, :series, :stories, :comics, :events, :thumbnail
5
5
 
6
- attr_reader :id, :first_name, :middle_name, :last_name, :full_name,
7
- :suffix, :resource_uri, :json
8
-
9
- class << self
10
- def build(results)
11
- if results.kind_of?(Array)
12
- results.collect do |creator|
13
- Marver::Creator.new(creator)
14
- end
15
- else
16
- new(results)
17
- end
6
+ def initialize(attributes)
7
+ attributes.each do |name, value|
8
+ instance_variable_set("@#{name}", value)
18
9
  end
19
10
  end
20
-
21
- def initialize(json)
22
- @json = json
23
- @id = @json['id']
24
- @first_name = @json['firstName']
25
- @middle_name = @json['middleName']
26
- @last_name = @json['lastName']
27
- @full_name = @json['fullName']
28
- @suffix = @json['suffix']
29
- @resource_uri = @json['resourceURI']
30
- end
31
-
32
11
  end
33
12
  end
@@ -1,34 +1,25 @@
1
1
  module Marver
2
2
  class Event
3
- include Marver::Summarizable
4
- include Marver::Commonable
3
+ attr_reader :title, :resource_uri, :description, :start, :end, :next, :previous,
4
+ :series, :stories, :events, :comics, :characters, :creators, :urls, :thumbnail
5
5
 
6
- attr_reader :json, :title, :resource_uri,
7
- :description, :start, :end, :next, :previous
6
+ def initialize(args)
7
+ @next = args[:next]
8
+ @previous = args[:previous]
9
+ @creators = args[:creators]
10
+ @characters = args[:characters]
11
+ @series = args[:series]
12
+ @stories = args[:stories]
13
+ @events = args[:events]
14
+ @comics = args[:comics]
15
+ @urls = args[:urls]
16
+ @thumbnail = args[:thumbnail]
17
+ @start = args[:start]
18
+ @end = args[:_end]
8
19
 
9
- class << self
10
- def build(results)
11
- if results.kind_of?(Array)
12
- results.collect do |event|
13
- Marver::Event.new(event)
14
- end
15
- else
16
- new(results)
17
- end
20
+ args[:attributes].each do |name, value|
21
+ instance_variable_set("@#{name}", value)
18
22
  end
19
23
  end
20
-
21
- def initialize(json)
22
- @json = json
23
-
24
- @title = @json['title']
25
- @resource_uri = @json['resourceURI']
26
-
27
- @description = @json['description']
28
- @start = DateTime.parse(@json['start'])
29
- @end = DateTime.parse(@json['end'])
30
- @next = Marver::Summary::Event.new(@json['next'])
31
- @previous = Marver::Summary::Event.new(@json['previous'])
32
- end
33
24
  end
34
25
  end
@@ -1,37 +1,23 @@
1
1
  module Marver
2
2
  class Serie
3
- include Marver::Summarizable
4
- include Marver::Commonable
3
+ attr_reader :id, :title, :resource_uri, :description, :start_year, :end_year, :comics,
4
+ :rating, :previous, :stories, :events, :creators, :characters, :next,
5
+ :urls, :thumbnail
5
6
 
6
- attr_reader :json, :id, :title, :resource_uri, :description,
7
- :start_year, :end_year, :rating, :next, :previous
7
+ def initialize(args)
8
+ @stories = args[:stories]
9
+ @events = args[:events]
10
+ @creators = args[:creators]
11
+ @characters = args[:characters]
12
+ @next = args[:next_serie]
13
+ @previous = args[:prev_serie]
14
+ @comics = args[:comics]
15
+ @urls = args[:urls]
16
+ @thumbnail = args[:thumbnail]
8
17
 
9
- class << self
10
- def build(results)
11
- if results.kind_of?(Array)
12
- results.collect do |serie|
13
- Marver::Serie.new(serie)
14
- end
15
- else
16
- new(results)
17
- end
18
+ args[:attributes].each do |name, value|
19
+ instance_variable_set("@#{name}", value)
18
20
  end
19
21
  end
20
-
21
- def initialize(json)
22
- @json = json
23
-
24
- @id = @json['id']
25
- @title = @json['title']
26
- @resource_uri = @json['resourceURI']
27
- @description = @json['description']
28
- @start_year = @json['startYear']
29
- @end_year = @json['endYear']
30
- @rating = @json['rating']
31
-
32
- @next = Marver::Summary::Serie.new(@json['next'])
33
- @previous = Marver::Summary::Serie.new(@json['previous'])
34
- end
35
-
36
22
  end
37
23
  end